爲了優化我的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