首页 > 解决方案 > 是否在 C 中移动有符号短未定义行为的有符号位?

问题描述

我听说转移到整数的有符号位,即

int test = INT_MAX;
test = (test<<1) + 1;

由于测试大于 INT_MAX 是未定义的行为。但是这种行为会在有符号短变量中遇到,即

short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;

?

目前我还没有遇到任何相关文件。

编辑:我知道未定义的行为将导致整数的情况,但不是短的。

标签: cundefined-behaviorbit-shiftinteger-promotion

解决方案


当在大多数类型的表达式中使用小整数类型时,将其提升int(如果int可以适合原始类型的所有值),然后在int.

这提供了两种可能性:

  1. int在与 大小相同的平台上short,移位将是未定义的行为,因为它会移位到int' 符号位。(更准确地说,原因是结果不能表示为int)。见C11 6.5.7p4
  2. int位数多于的平台上short,移位本身会成功(尽管如果移位超过 1,它可能是未定义的)。但是,当您将结果分配回short变量时,该值将无法表示为short. 将分配的实际值是实现定义的。见C11 6.3.1.3p3

推荐阅读