在第2.7.1节中,它指出:
为了说明整数常量的一些微妙之处,假设int类型使用16位的二补表示,类型long使用32位的二补表示,而类型long使用64位的二补表示。我们在表2-6中列出了一些有趣的整数常量. 从本表中值得注意的一点是,在2^15到2^16 -1范围内的整数在写入为十进制常量时将具有正值,而当写入为八进制或十六进制常量时将具有负值(并转换为int类型)。
但是,据我所知,在2^15 - 2^16-1范围内,以十六进制/八进制常量书写的整数在转换为unsigned类型时也具有正值。这本书错了吗?
发布于 2015-01-26 02:43:04
在所描述的设置中,范围为32768,65535的十进制文字具有long int类型,而该范围内的十六进制文本具有unsigned int类型。
因此,常量0xFFFF是值为65535的unsigned int,而常量65535是值为65535的签名long int。
我想你的短信是在讨论这些案件:
(int)0xFFFF
(int)65535现在,由于int不能表示值65535,这两者都会导致超出范围的转换,这是实现定义的(或者可能引发实现定义的信号)。
最常见的(事实上,我听说过的所有2的补码系统),它将在这两种情况下使用截断和重新解释的组合,给出-1的值。
所以你引用的最后一段有点奇怪。65535和0xFFFF都是大正数;(int)0xFFFF和(int)65535 (很可能)都是负数;但是如果你投出一个,而不是另一个,那么你就会得到一个不一致的结果,这并不奇怪。
https://stackoverflow.com/questions/28143918
复制相似问题