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

C语言表达式运算过程中是否会使用不同数据类型存储中间值?

结论

这个行为是C语言标准明确定义的,不属于未定义行为,也不是CPU寄存器执行带来的偶然结果,对应的规则称为整数提升(Integer Promotions),归属于C标准中的「通常算术转换」规则集。

规则来源与具体内容

C标准所有现行版本(C89/C99/C11/C17)的6.3.1.1 布尔、字符和整数章节都明确规定:

除了用作sizeof、_Alignof运算符的操作数,或者用作左值用于赋值、取地址之外,任何整数类型的取值在参与表达式运算时,如果int类型可以完整容纳原类型的所有可能取值,那么原类型的值会被自动转换为int;如果int无法完整容纳,就转换为unsigned int。以上转换称为整数提升。

对于绝大多数主流平台,unsigned char的取值范围是0~255,而int的取值范围至少是-32768~32767,完全可以覆盖unsigned char的所有取值,因此你代码中的a、b两个unsigned char变量,在参与位运算、乘除等算术运算前,会先被自动提升为int类型再完成计算。

对应你的代码示例解释

  • 第一个C示例中,(a << b) >> b整个运算全程都在int类型上完成:100作为int左移9位不会溢出,后续再右移9位可以完整恢复为100,直到最后赋值给unsigned char类型的r时,才会执行类型转换,最终输出100。
  • 第二个C示例中,你显式把a << b的结果存入unsigned char类型的c,赋值时会按照规则对int类型的运算结果做截断,得到值0,后续右移运算也是对值为0的unsigned char(提升为int后还是0)执行,所以输出0,和Go的行为一致。

补充说明

整数提升规则覆盖所有算术运算场景,不止位运算,你测试到乘除法也有相同表现是符合标准要求的。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:54:04