假设我们在 C 中编写了以下字符常量:
'\xFFFFAA'
它的数值是多少?
标准C99说:
- 字符常量有类型
int
。 - 十六进制字符常量可以表示为
unsigned char
. - 基本字符常量的值是非负的。
- 任何字符常量的值都在 的范围内
char
。
除了:
- 的值范围
signed char
包含在 的值范围内int
。 - 和的大小(以位为单位)
char
相同:1 个字节。unsigned char
signed char
- 字节的大小由 给出
CHAR_BIT
,其值至少为 8。
假设我们有典型的情况CHAR_BIT == 8
。
另外,让我们假设这char
是signed char
给我们的。
遵循规则:常量 '\xFFFFAA' 有 type int
,但它的值可以用 a 表示,unsigned char
尽管它的实际值适合 a char
。
根据这些规则,'\xFF' 的示例将为我们提供:
(int)(char)(unsigned char)'\xFF' == -1
第一次转换unsigned char
来自“可以表示为无符号字符”要求。
第二个演员char
来自“值适合一个字符”的要求。
第三次转换int
来自“具有 int 类型”要求。
但是,常数'\xFFFFAA'
太大,不能“表示”为unsigned int
。
它的价值是多少?
我认为该值是(char)(0xFFFFAA % 256)
由于标准或多或少地说明了以下内容的结果:
- 对于无符号整数类型,如果一个值大于该类型可以表示的最大M,则该值是取余数模M后得到的。
我对这个结论是否正确?
编辑我已经被@KeithThompson说服:他说,根据标准,一个大的十六进制字符常量是违反约束的。
所以,我会接受这个答案。
但是:例如,对于 GCC 4.8、MinGW,编译器会触发警告消息,并且程序会按照我描述的行为进行编译。因此,像'\x100020'这样的常量被认为是有效的,其值为0x20。