关于本书中的整数常量" C:参考手册"

时间:2015-01-26 02:15:12

标签: c integer hex decimal octal

在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范围内的整数也具有正值。这本书错了吗?

1 个答案:

答案 0 :(得分:1)

在所描述的设置中,[32768,65535]范围内的小数文字具有类型long int,该范围内的十六进制文字具有类型unsigned int

因此,常量0xFFFFunsigned int,值为65535,常量65535是带符号long int,值为65535。

我认为你的文本正试图讨论这些案例:

(int)0xFFFF
(int)65535

现在,由于int无法代表值65535,因此这两者都会导致超出范围的转换,这是实现定义的(或者可能会提出一个实现定义的信号。)

最常见的(事实上,我听过的所有2的补充系统),在这两种情况下都会使用截断和重新解释的组合,给出-1的值。

所以引用的最后一段有点奇怪。 655350xFFFF都是大正数; (int)0xFFFF(int)65535(可能)都是负数;但是如果你施放一个并且不投射另一个则会产生差异,这并不奇怪。