c - 在char中存储十六进制数

标签 c

#include <stdio.h>

int main(int argc, char const *argv[])
{
  char  a = 0xAA;
  int b;

  b = (int)a;
  b = b >> 4;

  printf("%x\n", b);
  return 0;
}

这里的输出是 fffffffa。任何人都可以向我解释一下这个输出是如何获得的吗?

最佳答案

C 标准允许编译器设计者选择是否 char已签名或未签名。看来您的系统使用签名 char s 和 32 位 int秒。由于 0xAA 的最高有效位(二进制 10101010 )被设置,该值被符号扩展为 0xFFFFFFAA .

将有符号值右移也会对结果进行符号扩展,因此当您移出低四位时,会从左侧移入四个位,从而导致最终输出 0xFFFFFFFA。 .

编辑: 根据 C99 规范,十六进制整数常量,例如 0xAA在您的示例中被视为 int s 的长度取决于它们的长度。因此,分配 0xAA签名 char超出范围:分配值的正确方法是使用十六进制字 rune 字,如下所示:

char a='\xAA';

关于c - 在char中存储十六进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17659959/

相关文章:

c - 使用 malloc 和 free 理解指针

c - 试图理解指针加法和减法,但是

c - C语言中将字符串赋值给指针

c - 关于在 C 中使用递归

java - 如何将字符串分成字符数组

c - C语言中如何使用If语句作为循环?

c - 在C中分配内存

c - sqlite3 - 除非重新启动脚本,否则脚本不会对表进行更改

c - Linux select() 不阻塞

c - 在 BLAS (cuBLAS/CUDA) 中将标量添加到 vector