1st -
之间有什么区别#define s 0xFF
和
#define s '\xFF'
第二 - 为什么第二行等于-1? 3 - 为什么在我尝试这个之后(在'\ xFF'的情况下)
unsigned char t = s;
putchar(t);
unsigned int p = s;
printf("\n%d\n", p);
输出
(blank)
-1
感谢:)
答案 0 :(得分:8)
此
#define s 0xFF
是十六进制整数常量的定义。它的类型为int
,十进制表示法的值为255。
此
#define s '\xFF'
是由十六进制转义序列表示的整数字符常量的定义。它也有int
类型,但它代表一个字符。它的价值计算方式不同。
根据C标准(第6.4.4.4节字符常量的第10页)
...如果整数字符常量包含单个字符或 转义序列,它的值是一个对象带有的结果 键入char,其值为单个字符或转义的值 序列转换为int。
默认情况下,您的编译器会将char类型的值视为 signed char 类型的值。所以根据引号整数字符常量 '\ xFF'具有负值,因为符号位(MSB)已设置且等于-1。
如果设置编译器的选项来控制char类型是否被认为是unsigned char的有符号或无符号,那么'\ xFF'和0xFF将具有相同的值255.
考虑到十六进制转义序列可以在字符串文字中与任何其他转义序列一起使用。
答案 1 :(得分:1)
您可以在string literal中使用'\xFF'
作为最后一个字符,也可以使用字符串连接作为中间字符,但0xFF
的情况不同。
'\xFF'
和0xFF
之间的差异类似于'a'
与字符'a'
的代码之间的差异(我们假设某些实现为0x61
)如果在字符串中使用,则只有差异'\xFF'
会消耗更多的十六进制字符。
使用putchar打印字符FF
时,输出取决于实现。但是当您将其打印为整数时,由于varargs的默认促销规则,它可能会在-1
表现为255
和{{1}的系统上打印char
或signed char
分别。