You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言<<=左移赋值运算符运行结果与预期不符问题求解

原因解释

你对<<=等价于c = c << 2的理解是对的,偏差来自你忽略了两个C语言的底层规则:char默认是有符号类型、复合赋值操作会做类型截断。

分步拆解运算过程

  1. 初始值:你的系统中char默认是signed char,取值范围为-128~127。0xAB转成有符号char的补码值为-85,存储在c中仅占8位。
  2. 第一个输出c << 2:
    C语言移位运算前会做整数提升,8位的char会先转成32位int,-85对应的int补码为0xFFFFFFAB,左移2位后得到0xFFFFFEAC,和你预期一致。
  3. 第二个输出c <<= 2:
    运算时先按上面的步骤得到int类型的0xFFFFFEAC,但赋值回char类型的c时,会截断保留低8位,也就是0xAC。0xAC作为signed char的补码值为-84,打印时再次整数提升为int,就得到符号扩展后的0xFFFFFFAC,和你预期的0xFFFFFEAC出现偏差。
  4. 第三个输出c <<= 2:
    此时c的存储值为0xAC,提升为int后是0xFFFFFFAC,左移2位得到0xFFFFFEB0,赋值回c时截断低8位为0xB0,打印时整数提升为int得到0xFFFFFFB0。

验证方案

如果把变量声明改成unsigned char c=0xAB,运算时不会做符号扩展,结果就会符合你的预期。

内容的提问来源于stack exchange,提问作者LogicNotFound

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:57:01