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
相关产品推荐
相关产品推荐

