C语言中,十六进制常量(例如0x23FE
)被视为有符号还是无符号整数?
这个数字本身总是被解释为非负数。十六进制常量没有符号或任何固有的表示负数的方式。常量的类型是第一个可以表示其值的类型:
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
u
。 - anatolyg0x8000
不是负数。如果它可以适合一个 int
,那么 0x8000 > 0x7000
将作为 int
的比较进行,否则 0x8000
是一个 unsigned
,而 0x7000
被提升为 unsigned
(没有更改值),并且比较是 unsigned
的比较。无论哪种方式,结果都是真的。 - CB Bailey0x23FEU
,但0x23FE
是有符号的。 - Alex它将它们视为 int
字面量(基本上是作为有符号整数!)。要编写无符号字面量,只需在末尾添加u
:
0x23FEu
int
的宽度为32位,则值0x8000
是unsigned
(即INT_MAX + 1
),而不是signed
(和INT_MIN
)。 - Jens Gustedtint
的宽度为 16 位,则 0x8000
将被视为无符号数? - CB Bailey0x8000
是有符号的,就像等价的字面值 32768
也是有符号的。你所说的毫无意义。仅仅因为一个字面值的值对于一个16位整数来说等于 INT_MAX + 1
并不能改变它类型的符号性质。0x8000
是有符号的。如果你想要无符号的话,需要相应地限定字面值为 0x8000U
。 - Alexint
类型,就可以作为int
类型使用;如果值更大,则应使用unsigned
、long
、unsigned long
等类型。请参阅C标准的第6.4.4.1节。正如被接受的答案所述。 - Jens Gustedtint
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
。