题 C中的无符号十六进制常量?


C是否处理十六进制常量(例如0x23FE)和有符号或无符号的int?


25
2018-01-19 16:22


起源


可能重复 默认情况下整数文字的类型不是int? - phuclv


答案:


数字本身始终被解释为非负数。十六进制常量没有符号或任何固有的方式来表示负数。常量的类型是第一个可以表示它们的值:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

24
2018-01-19 16:27



我缺乏宣传这一点的专业知识,但它比其他答案更有意义。
请注意,因此,0x8000可以是有符号或无符号,具体取决于sizeof(int)是2还是4。只需追加 u 如果你真的需要 unsigned。 - anatolyg
@anatolyg:我不确定你的“yuck”是什么意思。它总是积极的,如果被分配或提升到另一种类型,它总是转换为正确的值,其中值仍在范围内,这对我来说似乎是相当合理和理想的行为。 - CB Bailey
@anatolyg:但是 0x8000 不是消极的。它可以适合一个 int, 在这种情况下 0x8000 > 0x7000 是作为比较完成的 int, 除此以外 0x8000 是一个 unsigned 和 0x7000 被提升为 unsigned (没有变化的价值)和比较是比较 unsigned。无论哪种方式,结果都是正确的。 - CB Bailey
十进制和八进制常量也没有符号 - 如果你写的话 -1你正在写一个一元的 - 后跟一个十进制常量 1。在@ anatolyg的例子中, if (MYSIZE > -1) 可能会产生令人惊讶的结果,因为 -1 可能会也可能不会被提升为未签名的。 - caf


它将它们视为 int 文字(基本上,作为签名int!)。要编写无符号文字,只需添加即可 u 最后:

0x23FEu

11
2018-01-19 16:26



我不认为你可以这样说。例如,宽度为 int 是32位的值 0x8000 是 unsigned (即 INT_MAX + 1) 并不是 signed (和 INT_MIN)。 - Jens Gustedt
@JensGustedt:想必你的意思是如果宽度 int 是 16 然后 0x8000 将会 unsigned? - CB Bailey
@Charles,可能。自己计算比特从来都不是我的力量:) - Jens Gustedt


根据 cppreference,十六进制文字的类型是以下列表中的第一个类型,其中值可以适合。

int
unsigned int
long int
unsigned long int
long long int(since C99)
unsigned long long int(since C99) 

所以这取决于你的数量有多大。如果你的号码小于 INT_MAX,那就是类型 int。如果你的号码大于 INT_MAX 但小于 UINT_MAX,它是类型 unsigned int等等。

以来 0x23FE 小于 INT_MAX(是的 0x7FFF 或者更大),它是类型的 int

如果您希望它是未签名的,请添加一个 u 在数字的末尾: 0x23FEu


1
2017-09-02 02:47



这个答案似乎与C ++有关,而不是C.它可能是正确的,但我认为应该更新引用链接以指向C引用,而不是C ++引用。 - Radon Rosborough
@RadonRosborough我已经更新了使用C参考的答案,并检查了它的其他部分,以确保答案都是关于C.感谢指出它。 - Searene