书中关于整数常量"C: A reference manual"

About integer constants in the book "C: A reference manual"

在第 2.7.1 节整数常量中,它说:

To illustrate some of the subtleties of integer constants, assume that type int uses a 16-bit twos-complement representation, type long uses a 32-bit twos-complement representation, and type long long uses a 64-bit twos-complement representation. We list in Table 2-6 some interesting integer constants...

An interesting point to note from this table is that integers in the range 2^15 through 2^16 - 1 will have positive values when written as decimal constants but negative values when written as octal or hexadecimal constants (and cast to type int).

但是,据我所知,2^15 - 2^16-1 范围内的整数写成 hex/octal 常量在转换为类型 unsigned 时也有正值。书错了吗?

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

类型

因此,常量 0xFFFF 是一个 unsigned int,值为 65535,常量 65535 是一个带符号的 long int,值为 65535。

我认为你的文字试图讨论案例:

(int)0xFFFF
(int)65535

现在,由于 int 不能表示值 65535 这两个原因都会导致 超出范围的转换 这是 实现-defined(或可能引发实现​​定义的信号)。

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

所以你引用的最后一段有点奇怪。 655350xFFFF 都是大正数; (int)0xFFFF(int)65535 (可能)都是负数;但是如果你投了一个而没有投另一个,那么你会得到一个不足为奇的差异。