C语言<<=左移赋值运算符运行结果与预期不符问题求解
原因解释
你对<<=等价于c = c << 2的理解是对的,偏差来自你忽略了两个C语言的底层规则:char默认是有符号类型、复合赋值操作会做类型截断。
分步拆解运算过程
- 初始值:你的系统中
char默认是signed char,取值范围为-128~127。0xAB转成有符号char的补码值为-85,存储在c中仅占8位。 - 第一个输出
c << 2:
C语言移位运算前会做整数提升,8位的char会先转成32位int,-85对应的int补码为0xFFFFFFAB,左移2位后得到0xFFFFFEAC,和你预期一致。 - 第二个输出
c <<= 2:
运算时先按上面的步骤得到int类型的0xFFFFFEAC,但赋值回char类型的c时,会截断保留低8位,也就是0xAC。0xAC作为signed char的补码值为-84,打印时再次整数提升为int,就得到符号扩展后的0xFFFFFFAC,和你预期的0xFFFFFEAC出现偏差。 - 第三个输出
c <<= 2:
此时c的存储值为0xAC,提升为int后是0xFFFFFFAC,左移2位得到0xFFFFFEB0,赋值回c时截断低8位为0xB0,打印时整数提升为int得到0xFFFFFFB0。
验证方案
如果把变量声明改成unsigned char c=0xAB,运算时不会做符号扩展,结果就会符合你的预期。
内容的提问来源于stack exchange,提问作者LogicNotFound
相关产品推荐
相关产品推荐

