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

Amr*_*hit 27 c hex unsigned signed constants

C是否处理十六进制常量(例如0x23FE)和signed或unsigned int?

CB *_*ley 27

数字本身始终被解释为非负数.十六进制常量没有符号或任何固有的方式来表示负数.常量的类型是第一个可以表示它们的值:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
Run Code Online (Sandbox Code Playgroud)

  • 请注意,因此,0x8000 可能有符号或无符号,具体取决于 sizeof(int) 是 2 还是 4。糟糕!如果您确实需要“unsigned”,只需附加“u”即可。 (2认同)
  • @anatolyg:我不确定你所说的“糟糕”是什么意思。它始终为正值,如果分配或提升为值仍在范围内的另一种类型,它将始终转换为正确的值,这对我来说似乎是相当明智和可取的行为。 (2认同)
  • @anatolyg:但是`0x8000`不是负数。要么可以将其放入int中,在这种情况下,将0x8000> 0x7000作为int的比较,否则将0x8000设为unsigned,将0x7000提升为unsigned(不变)值),而比较则是“无符号”的比较。无论哪种方式,结果都是正确的。 (2认同)
  • 十进制和八进制常量也没有符号-如果您写`-1`,则表示正在写一元`-`,后跟十进制常量1。在@anatolyg的示例中,“ if(MYSIZE> -1)”可能会产生令人惊讶的结果,因为“ -1”可能会或可能不会升级为未签名。 (2认同)

Ara*_*raK 11

它将它们视为int文字(基本上,作为signed int!).要编写一个无符号文字,只需u在末尾添加:

0x23FEu
Run Code Online (Sandbox Code Playgroud)

  • 我不认为你可以这样说.例如,如果`int`的宽度是32位,则值"0x8000"是"unsigned"(即"INT_MAX + 1")而不是"signed"(和"INT_MIN"). (3认同)
  • @JensGustedt:大概你的意思是如果`int`的宽度是**16**那么`0x8000`将是`unsigned`? (2认同)
  • @亚历克斯,不。只要该值适合“int”,十六进制值就是“int”,对于更大的值,它是“unsigned”,然后是“long”,然后是“unsigned long”等。请参见 C 标准第 6.4.4.1 节。正如已接受的答案所述。 (2认同)

Sea*_*ene 5

根据cppreference,十六进制文字的类型是以下列表中可以容纳该值的第一个类型。

int
unsigned int
long int
unsigned long int
long long int(since C99)
unsigned long long int(since C99) 
Run Code Online (Sandbox Code Playgroud)

所以这取决于你的数字有多大。如果你的数字小于INT_MAX,那么它就是类型int。如果您的数字大于INT_MAX但小于UINT_MAX,则它的类型为unsigned int,依此类推。

由于0x23FE小于INT_MAX(等于0x7FFF或大于),因此它的类型为int

如果您希望它是无符号的,请u在数字末尾添加一个:0x23FEu

  • @RadonRosborough 我已经更新了答案以使用 C 参考,并检查了它的其他部分以确保答案都是关于 C 的。感谢您指出这一点。 (4认同)