是否在 C 中移动带符号短未定义行为的带符号位?
Is shifting the signed bit of a signed short undefined behaviour in C?
我听说移入整数的有符号位,即
int test = INT_MAX;
test = (test<<1) + 1;
是未定义的行为,因为测试大于 INT_MAX。但是在带符号的短变量中会遇到这种行为吗,即
short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;
?
目前我还没有找到任何相关文档。
编辑:我知道未定义的行为会导致整数的情况,但不会很短。
当大多数类型的表达式中使用小整数类型时,它是到一个int
(如果int
可以容纳原始类型的所有值),并且然后在 int
.
上执行表达式
这给出了两种可能性:
- 在
int
与 short
大小相同的平台上,移位将是未定义的行为,因为它移入了 int
的符号位。 (更准确地说,原因是结果不能表示为 int
)。参见 C11 6.5.7p4。
- 在
int
的位数多于 short
的平台上,移位本身将成功(但如果移位超过 1,则可能未定义)。但是,当您将结果分配回 short
变量时,该值将无法表示为 short
。将分配的实际值是实现定义的。参见 C11 6.3.1.3p3。
我听说移入整数的有符号位,即
int test = INT_MAX;
test = (test<<1) + 1;
是未定义的行为,因为测试大于 INT_MAX。但是在带符号的短变量中会遇到这种行为吗,即
short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;
?
目前我还没有找到任何相关文档。
编辑:我知道未定义的行为会导致整数的情况,但不会很短。
当大多数类型的表达式中使用小整数类型时,它是int
(如果int
可以容纳原始类型的所有值),并且然后在 int
.
这给出了两种可能性:
- 在
int
与short
大小相同的平台上,移位将是未定义的行为,因为它移入了int
的符号位。 (更准确地说,原因是结果不能表示为int
)。参见 C11 6.5.7p4。 - 在
int
的位数多于short
的平台上,移位本身将成功(但如果移位超过 1,则可能未定义)。但是,当您将结果分配回short
变量时,该值将无法表示为short
。将分配的实际值是实现定义的。参见 C11 6.3.1.3p3。