在2.7.1节的整数常量中,它说:
为了说明整数常量的一些细微之处,假设如此 type int使用16位二进制补码表示,类型为long uses 32位二进制补码表示,类型long long使用a 64位二进制补码表示。我们在表2-6中列出了一些 有趣的整数常量......
这张表中值得注意的一点是整数 当写为2时,范围2 ^ 15到2 ^ 16 - 1将具有正值 十进制常量,但写为八进制或。时为负值 十六进制常量(并转换为int类型)。
但是,据我所知,在转换为类型unsigned
时,写为十六进制/八进制常量的2 ^ 15 - 2 ^ 16-1范围内的整数也具有正值。这本书错了吗?
答案 0 :(得分:1)
在所描述的设置中,[32768,65535]范围内的小数文字具有类型long int
,该范围内的十六进制文字具有类型unsigned int
。
因此,常量0xFFFF
是unsigned int
,值为65535,常量65535
是带符号long int
,值为65535。
我认为你的文本正试图讨论这些案例:
(int)0xFFFF
(int)65535
现在,由于int
无法代表值65535
,因此这两者都会导致超出范围的转换,这是实现定义的(或者可能会提出一个实现定义的信号。)
最常见的(事实上,我听过的所有2的补充系统),在这两种情况下都会使用截断和重新解释的组合,给出-1
的值。
所以引用的最后一段有点奇怪。 65535
和0xFFFF
都是大正数; (int)0xFFFF
和(int)65535
(可能)都是负数;但是如果你施放一个并且不投射另一个则会产生差异,这并不奇怪。