为了账号安全,请及时绑定邮箱和手机立即绑定

签名/无符号比较

签名/无符号比较

C++
叮当猫咪 2019-07-02 17:32:25
签名/无符号比较我试图理解为什么下面的代码没有在指定的位置发出警告。//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 awayunsigned 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;我原以为这与背景晋升有关,但后两位似乎不这么认为。在我看来,第一个==和其他人一样,比较也是一种符号/无符号的错配?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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

编辑:参考资料:

5/9:(词句)

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

  • 如果其中一个操作数是长双操作数,则另一个操作数应转换为长双操作数。

  • 否则,如果其中一个操作数是双操作数,则另一个操作数应转换为双操作数。

  • 否则,如果其中一个操作数是浮动的,则另一个操作数将转换为浮动操作数。

  • 否则,综合晋升(4.5)应在两名操作人员中进行。

  • 然后,如果其中一个操作数是无符号的长操作数,则另一个操作数将转换为无符号长操作数。

  • 否则,如果一个操作数为长int,另一个操作数为无符号int,则如果长int可以表示无符号int的所有值,则无符号int应转换为长int;否则,这两个操作数将转换为无符号长int。

  • 否则,如果其中一个操作数是长的,则另一个将转换为LONG。

  • 否则,如果其中一个操作数没有签名,则另一个操作数应转换为无符号操作数。

4.7/2:(积分转换)

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2)。n其中n是用来表示无符号类型的位数)。[注意:在两个补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。]

EDIT 2:MSVC警告级别

当然,在MSVC的不同警告级别上警告的是开发人员的选择。在我看来,他们关于签名/无符号的平等与大/小比较的选择是有意义的,这当然是完全主观的:

-1 == -1意思是和-1 == (unsigned) -1-我觉得这是一个直观的结果。

-1 < 2 指的是-1 < (unsigned) 2-乍一看,这是不那么直观的,海事组织理应得到“早期”的警告。


查看完整回答
反对 回复 2019-07-02
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

=运算符只是按位进行比较(通过简单除法查看它是否为0)。

比比较小/大的人更多地依赖于数字的符号。

4位示例:

1111=15?还是-1?

所以如果你有1111<0001.这是模棱两可的.。

但如果你有1111=1111.这是一回事,尽管你不是故意的。


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 315 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信