在C11,C++ 11和C++ 14中执行以下操作是否合法?static_assert是否合法,签名的右移是否具有二进制补码行为?
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");
我不知道关于你是否可以使用实现定义的操作,如上述的等速表达式的规则。
我知道,负数的左边相反的带符号左移是不确定的,与机器类型无关。
考虑在代码中使用'/'来完全避免这个问题。无论换档定义如何,(-4)/ 2'总是“-2”。 – 2014-10-20 20:31:27
@Matt:虽然它已经趋于零,而换挡硬件经常是四舍五入的。所以很容易就会变得非常缓慢,也许轮到的就是想要的。 – 2014-10-20 20:33:22
@MattMcNabb:我的代码滥用符号“>>”的原因是我可以在高位构建一个掩码。例如,'x >> 31'等价于'x <0? -1:0'。当然,编译器已经为你做了这种优化,但有时它*不会*看到它在做什么。此外,这是在我的代码中非常热的部分完成的。 – Myria 2014-10-20 20:36:09