C语言编程之打印最高位为1的十六进制字符

标签 c hex

代码片段

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。在您的平台上,charsigned,因此c2 实际上是负数。 printf 因此打印出现在 int 中的所有前导值(这些是由于二进制补码表示)。

有(至少)3 种方法可以解决此问题:

  • 使用 %02X 而不是 %X 作为您的 printf 格式说明符。
  • 使用 unsigned char 而不是 char(这会被提升为 unsigned int,所以没有前导)
  • 将每个 char 显式转换为 int,然后掩码:(int)c2 & 0xFF

[注意:由此得出的结论是 char c2 = 0x80 的行为实际上是实现定义的;如果 charsigned 那么这将溢出。]

关于C语言编程之打印最高位为1的十六进制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8508709/

相关文章:

c - open() 在守护进程时返回错误

python - 如何使用 ctypes 将 NumPy 复杂数组与 C 函数连接起来?

javascript - 如何将十六进制字符串转换为字节数组,以及十六进制字符串中的字节数组?

c++ - 在 C++11 中声明 char 十六进制常量

c - 在C中逐位递归地求和两个数字

c++ - 窗口没有响应 XMoveResizeWindow 请求

c - switch 语句的非传统用法

Python:将多个十六进制值的字符串转换为整数

java - 如何让 Netbeans 默认为监视变量的十六进制显示?

postgresql - 具有十六进制值的 Golang+Postgres WHERE 子句