#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/