【发布时间】:2019-10-22 11:25:13
【问题描述】:
我正在研究 C 如何按位模式将数据存储在内存中。
但是,在printf 格式方面,我遇到了一些问题。
我已将变量保存为-10(我确实了解二进制补码)
另一个变量为246。这两个变量的位模式为11110110(即0xF6)。
我试图在printf 中使用unsigned int 十六进制格式打印出一个值。
char a = -10;
unsigned char b = 246;
printf("a : %x , b : %x\n" , (unsigned int) a, (unsigned int) b);
//a : fffffff6 , b : f6
两个整数具有相同的位模式0xF6。但是,如果我确实将类型转换为unsigned int,结果会有所不同。结果是0xFFFFFFF6 对应a,而b 保持不变。
对于有符号字符,在我看来,类型转换过程使unsigned char 变成一个整数,并用 1 填充所有空位。
这是因为他们的签名吗?或者这只是未定义的行为?
【问题讨论】:
-
是的。当提升为更大的有符号整数类型时,符号位向左扩展。因此所有 1 位。无符号整数类型没有符号位,因此全为零。
-
@PaulOgilvie 符号位是否在强制转换为更大的无符号类型时扩展?
-
@JL2210 抱歉在我的问题中犯了太多错误。我对这个论坛很陌生,英语不是我的母语...非常感谢您将我的帖子编辑成更易读的形式!
-
您看到的行为是正确的,而您的期望是错误的。
(unsigned)(-10) == UINT_MAX - 9。您期望的结果(错误地)假定(unsigned)(-10) == UCHAR_MAX - 9。