为什么0XAA是unsigned int而不是int?

5
我在《C Primer Plus,第6版》第3章的复习问题中看到了这个问题: 问题是: 给定以下十六进制常量:
a. 0X5 b. 0X15 c. 0X55 d. 0XAA
请确定每个常量的类型。
答案在附录A中: 注意d.0XAA,我的答案是int类型的常量,使用十六进制格式。但是答案是unsigned int类型的。 我想知道为什么。

这就是语言所定义的方式。某个时候有人决定应该这样做。除非你有一台时间机器并能询问几十年前做出这个决定的人,否则你无法真正找出原因。 - Art
这是你需要的参考资料:https://dev59.com/RGjWa4cB1Zd3GeqPsaLv - HighPredator
1
我收回我说的一切。显然,我一直错误地认为十六进制常量总是无符号的。它们不是。这本书是错的。 - Art
@Art 非常感谢 :) - Morris Li
2
为什么要点踩?作为一个初学者,在知名编程书籍中发现错误是相当令人印象深刻的。 - Lundin
显示剩余8条评论
1个回答

5

那本书是错误的。根据C11 6.4.4.1,十六进制整数常量的类型由此表确定:

Suffix    ...    Octal or Hexadecimal Constant

None      ...    int
                 unsigned int
                 long int
                 unsigned long int
                 long long int
                 unsigned long long int

u or U    ...    unsigned int
                 unsigned long int
                 unsigned long long int

你的常量0xAA没有后缀,因此上表中的顶部部分适用。意思是:编译器首先会检查该值是否适合于int类型。如果它不适合,则会检查它是否适合于unsigned int类型,以此类推。

在C的任何已知实现中,值0xAA肯定适合于int类型。答案正确的是int

然而,如果常量为0xAAu,则引用表格的底部部分将适用,并且结果将是unsigned int类型。


3
补充一下之前的回答,由于标准要求 INT_MAX 至少为 +32767,因此在没有后缀的情况下,所有从 0x00x7fff 的十六进制常量都是 int 类型。 - user694733
这个问题并没有被列入已知勘误之中,因此我已向出版商提交了一份勘误。 - Lundin
非常感谢您的回答,真心地感谢^_^ - Morris Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接