有符号/无符号比较

2023-11-23

我试图理解为什么以下代码不在指定位置发出警告。

//from limits.h
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define INT_MAX  2147483647 /* maximum (signed) int value */
            /* = 0x7fffffff */

int a = INT_MAX;
//_int64 a = INT_MAX; // makes all warnings go away
unsigned int b = UINT_MAX;
bool c = false;

if(a < b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a > b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a <= b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a >= b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a == b) // no warning <--- warning expected here
    c = true;
if(((unsigned int)a) == b) // no warning (as expected)
    c = true;
if(a == ((int)b)) // no warning (as expected)
    c = true;

我以为这与后台推广有关,但最后两个似乎不是这么说的。

在我看来,第一个==比较与其他比较一样是有符号/无符号不匹配吗?


当比较有符号和无符号时,编译器将有符号值转换为无符号值。为了平等,这并不重要,-1 == (unsigned) -1。对于其他比较很重要,例如以下是正确的:-1 > 2U.

编辑:参考资料:

5/9:(表达)

许多二元运算符期望 算术或枚举操作数 类型导致转换和产量 结果类型以类似的方式。这 目的是产生一个通用类型, 这也是结果的类型。 这种模式称为通常模式 算术转换,即 定义如下:

  • 如果其中之一 操作数的类型为 long double, 其他应转换为长 双倍的。
  • 否则,如果任一操作数 是双倍,另一个是 转换为双倍。
  • 否则,如果 一个操作数是 float,另一个是 float 应转换为浮点数。
  • 否则积分优惠 (4.5) 应同时执行 操作数.54)
  • 那么,如果任一操作数 是无符号长,另一个应是 转换为无符号长整型。
  • 否则,如果一个操作数是 long int 和另一个无符号 int,然后 如果一个long int可以代表所有 unsigned int 的值, unsigned int 应转换为 长整型;否则两个操作数 应转换为 unsigned long 国际。
  • 否则,如果任一操作数是 long,另一个应转换为 长的。
  • 否则,如果任一操作数 未签名的,其​​他应为 转换为无符号。

4.7/2:(积分转换)

If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there is no truncation). ]

EDIT2:MSVC 警告级别

MSVC的不同警告级别所警告的内容当然是开发者做出的选择。在我看来,他们在有符号/无符号相等与更大/更少比较方面的选择是有意义的,当然这完全是主观的:

-1 == -1意思是一样的-1 == (unsigned) -1- 我发现这是一个直观的结果。

-1 < 2 does not意思是一样的-1 < (unsigned) 2- 乍一看不太直观,IMO 值得“更早”警告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有符号/无符号比较 的相关文章

随机推荐

  • 将两行之间的文本替换为存储在 sed 变量中的文件内容

    假设我有一个名为original txt包含以下内容 red blue water food tree gray white 我还有一个名为new txt包含以下内容 green black yellow purple 现在我想编写一个脚本
  • 找不到开发人员磁盘映像堆栈溢出 xcode 7.2,iOS 9.3.1 [重复]

    这个问题在这里已经有答案了 将我的设备更新到 iOS 9 3 1 Xcode 后 给出 无法找到开发人员磁盘映像 我使用的是 xcode 7 2 请帮忙 您需要下载 Xcode v 7 3 使用 gt 9 3 iOS 版本 并升级到 Xco
  • Pyspark:选择特定列及其位置

    我想知道如何在数据框中选择具有编号但不具有名称的特定列 在 Pandas 中是这样的 df df iloc 2 这是可能的 您始终可以使用以下方式获取列的名称df columns n 进而select it df spark createD
  • scala - 从字符串中获取类

    在 Scala 中 我使用一个需要类参数的 Java 库 例子 def service OAuthService new ServiceBuilder provider classOf RunApi RunApi 是 Java 类 不过 我
  • 如何开通区域监控服务?

    我稍微简化了问题 当我在应用程序中创建和添加区域并询问这些区域的状态时 我在中看到以下内容monitoringDidFailForRegion方法 The operation couldn t be completed kCLErrorDo
  • 在 CVS 预提交挂钩中使用提交消息

    是否可以在 CVS 的预提交挂钩中使用提交消息 CVS 服务器正在远程运行 我使用以下命令访问它pserver 理想情况下 如果文件通过过滤器 我希望允许提交or提交消息包含特定文本 我没有选择使用其他版本控制系统 以下是一些有用的教程 供
  • OutOfMemory 时生成 java 转储

    我有一个程序最终应该生成OutOfMemory 程序代码为 public class VeryLargeObject implements Serializable public static final int SIZE 1 lt lt
  • Live555:基于“testOnDemandRTSPServer”的X264流直播源

    我正在尝试创建一个 rtsp 服务器来传输我的程序的 OpenGL 输出 我看了一下如何编写 Live555 FramedSource 以允许我直播 H 264 但我需要该流是单播的 所以我看了一下 testOnDemandRTSPServ
  • 如何使用 Facebook React 的 JSX 来拥有条件元素并保持 DRY?

    我如何有选择地在 JSX 中包含一个元素 下面是一个使用横幅的示例 如果已传入该横幅 则该横幅应位于组件中 我想要避免的是必须在 if 语句中重复 HTML 标记 render function var banner if this sta
  • 在 WooCommerce 结帐时禁用 AJAX

    我想问一下如何在结账页面 您输入送货和账单信息的地方 禁用 AJAX 而不是使用 AJAX 根据您的位置更新购物车摘要 而是通过自然刷新来更新 目前 每当用户通过送货位置切换其位置时 购物车摘要都会自行更新 而无需重新加载页面 我想删除该
  • 仅当密码时,ASP:TextBox 值才会在回发中消失

    我有一个像这样的 asp net 文本框
  • kprobes 支持 ftrace 后,Linux 内核中的跟踪点是否多余?

    当 Linux 内核中提供对 ftrace 的 kprobe 事件支持时 使用跟踪点事件的用例是什么 似乎使用 跟踪点事件 可以完成的所有事情都可以使用 kprobe 事件来完成 因为可以在跟踪点事件可用的同一点设置 kprobe 事件 我
  • POSIXct 值在 reshape2 dcast 中变为数字

    我正在尝试使用最新的 dcastreshape2包 1 2 1 对数据框 或 data table 进行非规范化 其中 value var 是 POSIXct 类型 但在生成的数据框中 日期值已丢失其 POSIXct 类并变为数字 如果我希
  • 在构造函数中初始化数组,而不使用默认构造函数或赋值

    考虑 struct A A int A const A struct B A foo 2 B const A x const A y foo x y HERE IS THE PROBLEM 我期待它能够工作 因为我在 GCC4 3 中使用
  • 如何查找我的 Android 应用程序的 MD5 指纹

    我正在尝试注册 Android Google 地图 它要求 MD5 指纹 如何从我的应用程序中获取指纹 我是密钥库的新手 无法理解我在网上找到的东西 如此简单的说明表示赞赏 提前致谢 您将需要两个密钥库 一个用于调试目的 一个用于发布目的
  • 是否可以在没有滚动条的情况下计算视口宽度(vw)? [复制]

    这个问题在这里已经有答案了 如标题所述 是否可以计算vw仅在CSS中没有滚动条 例如 我的屏幕宽度为1920px vw回报1920px 伟大的 但我的实际身体宽度只是这样1903px 有没有办法让我找回1903px仅带有 css 的值 不仅
  • __WEBPACK_IMPORTED_MODULE_4_react___default.a.memo 不是函数

    我只是使用 redux 和 react redux connect 函数连接应用程序 以及状态和调度 编译没有问题 但结果没有显示 如下所示 我试图找到它 发现我必须更改react版本 sudo npm install save email
  • 使用Django South从具体继承转向抽象继承

    我有一个现有的 Django 项目 其中有几个使用基类的具体继承的模型 经过仔细考虑 并阅读了人们喜欢雅各布 卡普兰 莫斯的内容后不得不说一下 在我的例子中没有必要使用这个具体的继承 我想改为使用抽象基类 使事情变得复杂的是我的网站是实时的
  • Tomcat v7.0 停止在本地主机上运行我的项目

    我正在 eclipse 中使用 Tomcat v7 0 开发我的 Web 应用程序 一切都很好 但今天突然我无法再在服务器上运行我的项目了 我像往常一样做 右键单击我的项目 gt 运行方式 gt 在服务器上运行 然后选择在我的 Tomcat
  • 有符号/无符号比较

    我试图理解为什么以下代码不在指定位置发出警告 from limits h define UINT MAX 0xffffffff maximum unsigned int value define INT MAX 2147483647 max