C语言中的无符号十六进制常量是什么?

34

C语言中,十六进制常量(例如0x23FE)被视为有符号还是无符号整数?


可能是整数字面量的类型默认不是int?的重复问题。 - phuclv
相关:为什么十进制和十六进制整数字面量被不同对待? 引用了 C99 的理由,解释了为什么相同值的十进制和十六进制常量之间存在类型差异(十六进制可以选择无符号类型)。 - Peter Cordes
3个回答

32

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

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

2
请注意,结果是0x8000时,根据 sizeof(int) 是2还是4,其数据类型可能为有符号或无符号。这很糟糕!如果你真的需要无符号,请在数字后加上 u - anatolyg
2
@anatolyg:我不确定你所说的“yuck”是什么意思。它始终为正值,并且如果分配或提升到另一种类型,其中该值仍在范围内,则始终会转换为正确的值,这对我来说似乎是相当明智和理想的行为。 - CB Bailey
2
@anatolyg:但 0x8000 不是负数。如果它可以适合一个 int,那么 0x8000 > 0x7000 将作为 int 的比较进行,否则 0x8000 是一个 unsigned,而 0x7000 被提升为 unsigned(没有更改值),并且比较是 unsigned 的比较。无论哪种方式,结果都是真的。 - CB Bailey
2
十进制和八进制常量也没有符号 - 如果你写了“-1”,那么你写的是一个一元运算符“-”后面跟着一个十进制常量“1”。在@anatolyg的例子中,“if (MYSIZE > -1)”可能会产生令人惊讶的结果,因为“-1”可能会被提升为无符号数。 - caf
1
十六进制字面量没有符号是不正确的说法。它们是有符号的。如果你想要无符号,可以使用0x23FEU,但0x23FE是有符号的。 - Alex
显示剩余7条评论

15

它将它们视为 int 字面量(基本上是作为有符号整数!)。要编写无符号字面量,只需在末尾添加u

0x23FEu

5
我认为你不能把那个陈述留在原样。例如,如果int的宽度为32位,则值0x8000unsigned(即INT_MAX + 1),而不是signed(和INT_MIN)。 - Jens Gustedt
3
您的意思是,如果 int 的宽度为 16 位,则 0x8000 将被视为无符号数? - CB Bailey
1
@Charles,也许吧。自己数位并不是我的强项 :) - Jens Gustedt
@JensGustedt 你说的并不正确。十六进制字面值 0x8000 是有符号的,就像等价的字面值 32768 也是有符号的。你所说的毫无意义。仅仅因为一个字面值的值对于一个16位整数来说等于 INT_MAX + 1 并不能改变它类型的符号性质。0x8000 是有符号的。如果你想要无符号的话,需要相应地限定字面值为 0x8000U - Alex
2
@Alex,不是的。十六进制值只要适合于int类型,就可以作为int类型使用;如果值更大,则应使用unsignedlongunsigned long等类型。请参阅C标准的第6.4.4.1节。正如被接受的答案所述。 - Jens Gustedt
@JensGustedt 对不起,我不知道解释中的符号会交替变化(而且这种方式非常奇怪)。 - Alex

5
根据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
如果你想让它成为无符号数,在数字末尾添加一个u0x23FEu

此回答似乎与C语言无关,而是涉及到C++。它可能是正确的,但我认为参考链接应该更新为指向C语言参考,而不是C++参考。 - Radon Rosborough
4
我已经更新了答案,使用了C语言参考,并检查了其他部分以确保答案完全涉及C语言。感谢您指出这一点。 - Searene

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