是否在C中移动带符号的短未定义行为的带符号位?

时间:2018-12-12 15:25:47

标签: c undefined-behavior bit-shift integer-promotion

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

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

是不确定的行为,因为测试大于INT_MAX。但是在带符号的短变量(即

)中会遇到这种行为吗?
short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;

目前我还没有找到任何相关文档。

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

1 个答案:

答案 0 :(得分:6)

在大多数类型的表达式中使用小整数类型时,它是promotedint(如果int可以适合原始类型的所有值),则表达式然后在int上执行。

这提供了两种可能性:

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