为什么使用 printf 将 char 的十六进制表示打印到屏幕有时会打印 4 字节数字?
这是我写的代码
#include <stdio.h>
#include <stdint.h>
#include<stdio.h>
int main(void) {
char testStream[8] = {'a', 'b', 'c', 'd', 0x3f, 0x9d, 0xf3, 0xb6};
int i;
for(i=0;i<8;i++){
printf("%c = 0x%X, ", testStream[i], testStream[i]);
}
return 0;
}
下面是输出:
a = 0x61, b = 0x62, c = 0x63, d = 0x64, ? = 0x3F, � = 0xFFFFFF9D, � = 0xFFFFFFF3, � = 0xFFFFFFB6
最佳答案
char
似乎已在您的系统上签名。对于整数的标准“二进制补码”表示,设置最高有效位意味着它是一个负数。
为了将 char
传递给像 printf
这样的可变参数函数,它必须扩展为 int
。为了保留其值,符号位被复制到所有新位(0x9D
→ 0xFFFFFF9D
)。现在,%X
转换需要并打印一个 unsigned int
,您会看到所有设置的位都是负数,而不是负号。
如果你不想要这个,你必须使用 unsigned char
或者在将它传递给 printf
时将其转换为 unsigned char
.与 signed char
相比,unsigned char
没有额外的位,因此具有相同的位模式。当无符号值得到扩展时,新位将为零,您首先会得到预期的结果。
关于c - 为什么打印 char 有时会在 C 中打印 4 个字节的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562714/