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

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 根据,十六进制文字的类型是下面列表中可以容纳该值

C是否处理十六进制常量(例如0x23FE)和有符号或无符号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。谢谢指点。可能的副本