~(~0<<32)為什么等于零
uj5u.com熱心網友回復:
你可以回圈列印看看變化for (int i=0; i<33; i++) {
printf("%08X\n", ~0<<i);
printf("%08X\n", 1<<i);
}
也就是~0=0xFFFFFFFF,左移32位,相當于int的位數的一個回圈,又回到了原點
所以相當~(~0),所以還是0
uj5u.com熱心網友回復:
解釋不通
~的優先級高于<
先執行~后執行<<
0按照字面量理解的時候是int型別, 就當做32位來解釋吧
~0是0xFFFFFFFF
左側移動32結果是0
最后括號外面的~會把結果變成0xFFFFFFFF
如何解釋?
uj5u.com熱心網友回復:
正確答案是這樣的對于 x << y的處理
要分兩種情況,區分字面量和運算式
如果是字面量, 那么y大于等于32的時候,都是0(這是編譯器處理,編譯器夠智能才行)
不管是1<<32 還是 0xFFFFFFFF<<32 都是0
你可以去測驗!
如果是運算, 那么首先把y對32取模,然后再進行移動計算
所以樓主的代碼執行程序是這樣的
1: ~(~0<<32)
2: ~(0xFFFFFFFF << 32 )
3: ~(0xFFFFFFFF << 0)
4: ~0xFFFFFFFF
5: 0
這題是一些面試官經常考的問題!
所你會發現, 把一個數直接左移動32次,和回圈32次,一次移動一位的結果完全不同
代碼上你可以寫 1<<33,但是這就是字面量了, 直接是0(有的編譯器可能會不同)
如果int v=1; v<<33
哈, 這個有意思, 它等價于v<1; 二不二
uj5u.com熱心網友回復:
沒懂那個代碼執行程序2-3步
uj5u.com熱心網友回復:
嚯嚯,原來如此也就是說移位運算如有運算式(不管在移位符的左邊還是右邊),就會把位移的位數先對32取模,取模的結果才是最終位移的位數
所以改一下步驟2,也許LZ就能理解了
1: ~(~0<<32)
2: ~(~0 << (32%32) )
3: ~(0xFFFFFFFF << 0)
3: ~(0xFFFFFFFF << 0)
4: ~0xFFFFFFFF
5: 0
uj5u.com熱心網友回復:
哦哦,這樣可以懂了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/123396.html
標籤:C語言
上一篇:C++實作逆序輸出一個數的各位
