在C11、C++11和C++14中,以下操作是否合法?
或者使用C语言的等效方式:
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
。 - M.M>>
的原因是为了在高位构建掩码。例如,x >> 31
相当于x < 0 ? -1 : 0
。当然,编译器已经为您执行了这种优化,但有时它并不知道自己在做什么。此外,这是在我的代码中极其繁忙的部分完成的。 - Myriagcc -O3
,两者都会执行sarl $31, %eax
。最大可移植性和最大速度通常是相互冲突的目标。 - M.M<assert.h>
,C语言中的等效写法仍然是static_assert(...
。 - Cubbi