c - 为什么打印 char 有时会在 C 中打印 4 个字节的数字

标签 c

为什么使用 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。为了保留其值,符号位被复制到所有新位(0x9D0xFFFFFF9D)。现在,%X 转换需要并打印一个 unsigned int,您会看到所有设置的位都是负数,而不是负号。

如果你不想要这个,你必须使用 unsigned char 或者在将它传递给 printf 时将其转换为 unsigned char .与 signed char 相比,unsigned char 没有额外的位,因此具有相同的位模式。当无符号值得到扩展时,新位将为零,您首先会得到预期的结果。

关于c - 为什么打印 char 有时会在 C 中打印 4 个字节的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562714/

相关文章:

c - 当您访问前一个堆栈变量时会发生什么?

c - 删除二叉堆中的最顶层元素

创建一个程序,要求用户输入名称并使用 C 创建 10 个名称序列化的文件

python - 使用 ctypes 从无效函数(段错误)x64 获取指针

python - 如何在 python 中修改 Python 变量(如引用)的值

c - 为什么只有在重定向之前调用了 printf 才能使用 dup2 重定向到标准输出

C - 将 base64 方法添加到我的文件中

c - 在 OpenACC 的 PGI 编译器中使用 -fast 时,如何解决循环携带的依赖关系阻止循环向量化

带有命令行选项的 C 程序

c - 将标准输出重定向到文件?