【问题标题】:Why is 0XAA an unsigned int and not an int?为什么 0XAA 是无符号整数而不是整数?
【发布时间】:2016-11-18 12:24:01
【问题描述】:

我在 C Primer Plus,第 6 版,第 3 章的复习问题中看到了这一点。

问题:

附录 A 中的答案:

注意d.0XAA,我的答案是int常量,十六进制格式,但答案是unsigned int

我想知道为什么

【问题讨论】:

  • 这就是语言定义它的方式。有人在某个时候决定应该是这样的。除非您有一台时光机,并且可以询问几十年前做出该决定的人,否则您无法真正找出原因。
  • @Art 您能否提供更多来自 C 标准或其他内容的信息?我会很感激的:)
  • 我收回我所说的一切。显然我一直错误地认为十六进制常量总是无符号的。他们不是。书错了。
  • 为什么投反对票?作为初学者,在著名的编程书籍中发现错误非常令人印象深刻。

标签: c


【解决方案1】:

那本书不正确。根据 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

【讨论】:

  • 补充答案,因为标准要求INT_MAX 至少为+32767,所以从0x00x7fff 的所有不带后缀的十六进制常量始终为int
  • 这未在已知勘误表中列出,因此我已向发布者提交了勘误表。
  • 真诚感谢您的回答^_^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2014-12-12
  • 1970-01-01
  • 2018-06-08
  • 2011-08-11
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多