c - 打印存储为字符串的十六进制值会产生意外输出

标签 c string char hex printf

我在字符串中定义了 C 语言的十六进制数字:

char chars[] = "\xfb\x54\x9c\xb2\x10\xef\x89\x51\x2f\x0b\xea\xbb\x1d\xaf\xad\xf8";

然后我想将这些值与另一个值进行比较。它不起作用,如果我打印如下值:

printf("%02x\n", chars[0]);

它写入 fffffffb。为什么会这样以及如何准确获取 fb 值?

最佳答案

这是因为符号扩展。

改变

printf("%02x\n", chars[0]);

printf("%02x\n", (unsigned char)chars[0]);

%x 格式说明符将在 32 位机器上读取 4 个字节。由于您已将 chars 声明为字符数组,因此在获取值时 fb(负值)将被符号扩展为 fffffffb,其中 MSB fb 设置为它之前的所有其他位。

更多详细信息请参阅此 sign extension

如果您将 char chars[] 声明为 unsigned char chars[],那么打印将如预期的那样。

关于c - 打印存储为字符串的十六进制值会产生意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852958/

相关文章:

c - 如何在for循环中获取3次数组?

C - 指针插入算法

javascript - 带有字符串对象的 jQuery 选择器不起作用

python - 在 Python 中使用多个分隔符拆分字符串

java - Java中如何将字符串的第一个字符放在字符串的最后一个位置?

c - 作为函数类型的结构

python - 从字符串到整数的转换

c - malloc 上的 struct * 和 char * 段错误

将输入从 `getchar()` 复制到另一个变量

c - 错误: Control may reach end of non-void function - cat function