在教科书中,有一个有关未签名和已签名数字之间比较的表
它表示当比较的一个操作数为无符号时,评估中将带有*标记,而另一个操作数被隐式转换为无符号。
2147483647是带符号的数字,而(int)2147483648U也是带符号的数字,因此类型也带符号,但是为什么评估中带有*标记? 我认为2147483647和(int)2147483648U之间没有隐式强制转换?他们怎么了?
编辑:我认为书中有一些错误。抱歉造成混淆
答案 0 :(得分:0)
假定2147483647
在系统上可由int
表示(并且在32位宽的典型系统上可以表示),则该文字的类型为int
。
(int)some_value
始终是整数。
因此2147483647 > (int)2147483648U
不涉及隐式转换-仅存在显式转换。
我认为2147483647和(int)2147483648U之间没有隐式转换吗?
您认为正确。
但是为什么评估中带有*标记?
我认为这本书可能有误。
它们会发生什么?
如果在系统上2147483648
不能用int
表示(并且在32位宽的典型系统上不是),则显式转换的结果值由实现定义,因此C ++标准在技术上不能保证比较的结果。
但是,在我所知道的所有符号表示格式中,在符号表示中无法表示的所有未签名值(相同宽度)具有与某个负值相同的表示,因此在实践中,比较将是{{1} },尽管该标准缺乏保证。
第二,(无符号)-1是无符号的,而-2是有符号的。因此,存在对无符号的隐式转换...
正确。
...但是评估中没有*标记。怎么了?
据我所知,这是本书中的另一个错误。也许他们放错了星号。