C中的无符号十六进制常数?
C是否处理十六进制常量(例如0x23FE)和有符号或无符号int?它将它们视为C中的无符号十六进制常数?,c,constants,hex,unsigned,signed,C,Constants,Hex,Unsigned,Signed,C是否处理十六进制常量(例如0x23FE)和有符号或无符号int?它将它们视为int文本(基本上是有符号int!)。要编写无符号文字,只需在末尾添加u: 0x23FEu 数字本身始终被解释为非负数。十六进制常量没有符号或任何固有的方式来表示负数。常数的类型是第一个可以表示其值的类型: int unsigned int long int unsigned long int long long int unsigned long long int 根据,十六进制文字的类型是下面列表中可以容纳该值
int
文本(基本上是有符号int!)。要编写无符号文字,只需在末尾添加u
:
0x23FEu
数字本身始终被解释为非负数。十六进制常量没有符号或任何固有的方式来表示负数。常数的类型是第一个可以表示其值的类型:
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
根据,十六进制文字的类型是下面列表中可以容纳该值的第一种类型
int
unsigned int
long int
unsigned long int
long long int(since C99)
unsigned long long int(since C99)
所以这取决于你的数字有多大。如果您的数字小于INT\u MAX
,则它属于INT
类型。如果您的数字大于INT\u MAX
,但小于UINT\u MAX
,则它属于无符号INT
类型,依此类推
由于0x23FE
小于INT\u MAX
(即0x7FFF
或更大),因此它属于INT
类型
如果您想让它不带签名,请在数字的末尾添加一个
u
:0x23FEu
我认为您不能保留该语句。例如,假设int
的宽度是32位,那么0x8000
的值是无符号的(即int\u MAX+1
),而不是有符号的(和int\u MIN
)。@JensGustedt:你的意思大概是,如果int
的宽度是16位,那么0x8000
将是无符号的,可能我的力量从来就不是自己数碎片:)@JensGustedt你说的不是真的。十六进制文字0x8000
被签名,就像等效文字32768
被签名一样。你说的没有道理。仅仅因为一个16位整数的文本值等于INT_MAX+1
,它的类型的有符号性不会改变任何东西<代码>0x8000
已签名。如果需要无符号,则需要相应地将文本限定为0x8000U
@Alex,否。只要值符合int
,则十六进制值为int
,对于较大的值为unsigned
,然后是long
,然后是unsigned long
等。参见C标准第6.4.4.1节。正如已接受的答案所述。请注意,因此,0x8000可能是有符号的,也可能是无符号的,这取决于sizeof(int)是2还是4。讨厌!如果你真的需要unsigned
,只需附加u
。@anatolyg:我不知道你说的“恶心”是什么意思。它将始终为正值,如果分配或升级到另一种类型,并且该值仍在范围内,则它将始终转换为正确的值,这对我来说似乎是相当合理和可取的行为。@anatolyg:但是0x8000
不是负值。它可以放在int
中,在这种情况下,0x8000>0x7000
作为int
的比较,否则0x8000
是一个unsigned
,0x7000
升级为unsigned
(值不变),比较是unsigned
的比较。无论哪种方式,结果都是正确的。十进制和八进制常量也没有符号-如果你写-1
,你写的是一元-
,后面跟着一个十进制常量1
。在@ ANATOLYG的示例中,<代码>(MySeig-> 1)< /C>可以产生令人惊讶的结果,因为<代码> -1 < /C> >可能或可能不被提升为未签名。@ CAF:<代码> 0x8000 > -1 < /C>是一个更好的例子,这里需要绝对小心。这个答案似乎与C++无关,而不是C。但我认为参考链接应该更新为C引用,而不是C++引用。@ RaRoNoSrdBoo.I更新了答案,使用C引用并检查了它的其他部分,以确保答案全部是C。谢谢指点。可能的副本