【发布时间】:2026-02-17 07:25:02
【问题描述】:
C 是否处理十六进制常量(例如 0x23FE)和有符号或无符号整数?
【问题讨论】:
标签: c constants hex unsigned signed
C 是否处理十六进制常量(例如 0x23FE)和有符号或无符号整数?
【问题讨论】:
标签: c constants hex unsigned signed
根据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。
【讨论】:
数字本身总是被解释为非负数。十六进制常量没有符号或任何固有的方式来表示负数。常量的类型是其中第一个可以表示其值的类型:
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
【讨论】:
unsigned,只需附加u。
0x8000 不是负面的。它可以适合int,在这种情况下,0x8000 > 0x7000 与int 进行比较,否则0x8000 是unsigned,0x7000 提升为unsigned(值没有变化),比较是unsigned的比较。无论哪种方式,结果都是正确的。
-1,你写的是一元-,后面跟着一个十进制常量1。在@anatolyg 的示例中,if (MYSIZE > -1) 可能会产生令人惊讶的结果,因为-1 可能会或可能不会被提升为无符号。
0x8000 > -1 是一个更好的例子,说明哪些地方确实需要护理。
它将它们视为int 文字(基本上,作为有符号整数!)。要编写无符号文字,只需在末尾添加 u:
0x23FEu
【讨论】:
int 的宽度是 32 位,则 0x8000 的值是 unsigned(即 INT_MAX + 1)而不是 signed(和 INT_MIN)。
int 的宽度是16 位那么0x8000 将是unsigned?
0x8000 已签名,就像等效文字 32768 已签名一样。你说的没有道理。仅仅因为 16 位整数的文字值等于 INT_MAX + 1 并不会改变其类型的符号。 0x8000 已签名。如果您想要无符号,则需要将文字相应地限定为0x8000U。
int,只要该值适合 int,对于更大的值,它是 unsigned,然后是 long,然后是 unsigned long 等。请参阅 C 标准的第 6.4.4.1 节。正如公认的答案所述。