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

C语言中char类型变量执行左移操作出现异常行为相关问题问询

你遇到的情况不属于C语言的未定义行为,输出640是完全符合C语言标准的合法结果,核心原因是你忽略了C语言的整数提升规则。

原因解释

  • 整数提升规则:C标准规定,所有精度低于int的整数类型(包括char、short等)在参与算术运算前,会先被隐式转换为int类型(如果int可以容纳原类型的全部取值,否则转换为unsigned int)。你代码中的char c = 5在执行左移操作前,已经被提升为int类型的数值5,后续的左移操作是在int类型上完成的。
  • 运算过程:int类型的最小取值范围是-32768~32767,5左移7位等价于5 * 2^7 = 640,这个结果完全在int的合法取值范围内,不存在溢出问题,因此运算结果确定为640,不属于未定义行为。
  • 补充说明:char默认是signed还是unsigned属于C语言的实现定义行为,即便你的运行环境中char为signed,也不会影响本次运算结果,因为整数提升发生在左移运算之前。

如何得到你预期的-128

如果你需要将左移结果限制在char类型范围内,需要显式将运算结果强制转换回char类型,修改后的代码如下:

#include <stdio.h>

int main()
{
    char c = 5;
    printf("%d\n", (char)(c << 7));
    return 0;
}

这段代码的输出就是你预期的-128。

什么情况左移属于未定义行为

只有当对有符号整数执行左移操作后,结果超出该有符号整数类型的取值范围时,才属于未定义行为。你的场景中运算发生在int类型上,结果合法,因此不触发未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:36:03