gpt4 book ai didi

c++ - static_assert signed shift right 具有二进制补码行为是否合法?

转载 作者:太空狗 更新时间:2023-10-29 19:58:04 25 4
gpt4 key购买 nike

在 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 中说:

The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2^E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.

在 [expr.const]/2 中没有任何地方说这样的移位,或者具有实现定义值的表达式通常不是常量表达式。因此,您将获得一个具有实现定义值的常量表达式。

关于c++ - static_assert signed shift right 具有二进制补码行为是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com