签名号和未签名号之间的比较

时间:2018-10-22 15:59:59

标签: c++ comparison bit unsigned signed

在教科书中,有一个有关未签名和已签名数字之间比较的表

enter image description here

它表示当比较的一个操作数为无符号时,评估中将带有*标记,而另一个操作数被隐式转换为无符号。

2147483647是带符号的数字,而(int)2147483648U也是带符号的数字,因此类型也带符号,但是为什么评估中带有*标记? 我认为2147483647和(int)2147483648U之间没有隐式强制转换?他们怎么了?

编辑:我认为书中有一些错误。抱歉造成混淆

1 个答案:

答案 0 :(得分:0)

假定2147483647在系统上可由int表示(并且在32位宽的典型系统上可以表示),则该文字的类型为int

由于显式转换,

(int)some_value始终是整数。

因此2147483647 > (int)2147483648U不涉及隐式转换-仅存在显式转换。

  

我认为2147483647和(int)2147483648U之间没有隐式转换吗?

您认为正确。

  

但是为什么评估中带有*标记?

我认为这本书可能有误。

  

它们会发生什么?

如果在系统上2147483648不能用int表示(并且在32位宽的典型系统上不是),则显式转换的结果值由实现定义,因此C ++标准在技术上不能保证比较的结果。

但是,在我所知道的所有符号表示格式中,在符号表示中无法表示的所有未签名值(相同宽度)具有与某个负值相同的表示,因此在实践中,比较将是{{1} },尽管该标准缺乏保证。


  

第二,(无符号)-1是无符号的,而-2是有符号的。因此,存在对无符号的隐式转换...

正确。

  

...但是评估中没有*标记。怎么了?

据我所知,这是本书中的另一个错误。也许他们放错了星号。