代码片段
char c1;
char c2;
c1 = 0X7F;
c2 = 0X80;
printf("c1 = %X\nc2 = %X\n", c1, c2);
输出
c1 = 7F
c2 = FFFFFF80
为什么 c2
不打印为 80
? (我猜这与 0X80 的最高有效位为 1 而 0x7F 的 MSB 为 0 这一事实有关)。我怎样才能让 c2
打印成简单的 80
?
最佳答案
因为 printf
是一个可变函数。可变函数的参数接受默认提升;这样做的一个效果是 char
参数被转换为 int
。在您的平台上,char
是signed
,因此c2
实际上是负数。 printf
因此打印出现在 int
中的所有前导值(这些是由于二进制补码表示)。
有(至少)3 种方法可以解决此问题:
使用%02X
而不是%X
作为您的printf
格式说明符。- 使用
unsigned char
而不是char
(这会被提升为unsigned int
,所以没有前导) - 将每个
char
显式转换为int
,然后掩码:(int)c2 & 0xFF
。
[注意:由此得出的结论是 char c2 = 0x80
的行为实际上是实现定义的;如果 char
是 signed
那么这将溢出。]
关于C语言编程之打印最高位为1的十六进制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8508709/