为了优化我的cpp代码,我试图在某些情况下使用Right Shifting。这里有一个例子:
是否正确移动cpp和java中负数的未定义行为?
int main()
{
int i = (1 - 2) >> 31; // sizeof(int) == 4
...
...
}
我打印的i
和我-1
。这意味着如果数字为负值,它将使用1
而不是0
来填充空位。换句话说,-1 >> 31
如下工作:
1111...1 <--- the result of (1 - 2), which is -1
1111...1 <--- -1 >> 31, 1 is used to fill in the empty position
我只是想知道,如果这种行为被明确定义或没有?
如果是cpp中的UB,那么在Java中呢?
可能的重复[是左移(<<)在C++ 11中的一个负整数未定义行为?](https://stackoverflow.com/questions/19593938/is-left-shifting-a-negative- integer-undefined-behavior-in-c11) – user0042
在Java中,绝对不是未定义的。 '>>'符号扩展名,'>>>'不。请参阅[Java™教程 - 位移和位移运算符](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)或权威源语言Java语言规范[15.19。 Shift运算符](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19)。 – Andreas
*“在Java中怎么样?”* - 为什么停留在Java,在C#和Rust中询问它。 – StoryTeller