[英]Is it legal to static_assert that signed shift right has two's-complement behavior?
在C11,C ++ 11和C ++ 14中执行以下操作是否合法?
static_assert(((-4) >> 1) == -2, "my code assumes sign-extending right shift");
或等效的C:
_Static_assert(((-4) >> 1) == -2, "my code assumes sign-extending right shift");
我不知道关于是否可以使用如上所述的实现定义的操作的常量表达式的规则。
我知道,无论机器类型如何,相反的,带负数的左移符号都是未定义的。
是。 C ++ 11标准在[expr.shift] / 3中说:
E1 >> E2
的值是E1
右移E2
位位置。 如果E1
具有无符号类型或者E1
具有有符号类型和非负值,则结果的值是E1/2^E2
的商的整数部分。 如果E1具有带符号类型和负值,则结果值是实现定义的。
并且在[expr.const] / 2中没有任何地方可以说这样的移位或具有实现定义值的表达式通常不是常量表达式。 因此,您将获得具有实现定义值的常量表达式。
这是合法的,因为它不会导致不确定的行为。
负值右移的行为是实现定义的 。 C和C ++标准不保证它是算术的还是逻辑的; 虽然据我所知,从来没有一个CPU没有选择其中一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.