2017-05-30 82 views
4

我的問題是爲什麼a>>1移位標誌位,但不是(a & 0xaaaaaaaa) >> 1當右移操作>>移位標誌位,當它不?

代碼片斷

int a = 0xaaaaaaaa; 
std::cout << sizeof(a) << std::endl; 
getBits(a); 
std::cout << sizeof(a>>1) << std::endl; 
getBits(a >> 1); 
std::cout << sizeof(a & 0xaaaaaaaa) << std::endl; 
getBits(a & 0xaaaaaaaa); 
std::cout << sizeof((a & 0xaaaaaaaa)>>1) << std::endl; 
getBits((a & 0xaaaaaaaa) >> 1); 

結果

4 
10101010101010101010101010101010 
4 
11010101010101010101010101010101 
4 
10101010101010101010101010101010 
4 
01010101010101010101010101010101 
+1

移位操作服從左邊參數的符號性。所以你應該質疑'a'的類型以及'a&0xaaaaaaaa'的類型。 –

+2

_「對於負數a,a >> b的值是實現定義的(在大多數實現中,這將執行算術右移,以便結果保持負值)。」_ source:http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_shift_operators –

回答

8

a >> 1很無聊。它只是signed類型的實現定義爲負數a

(a & 0xaaaaaaaa) >> 1更有趣。對於您有32位int(其中包括)的可能情況,0xaaaaaaaaunsigned文字(十六進制文字的模糊規則)。因此,由於C++類型促銷規則a也轉換爲unsigned類型,因此表達式a & 0xaaaaaaaa的類型因此是unsigned

爲酒吧測驗提出了一個很好的問題。

參考:http://en.cppreference.com/w/cpp/language/integer_literal,尤其是「文字的類型」表。

+0

根據引用,0xaaaaaaaa不能放入'int'。所以它有'unsigned int'類型。這條規則並不晦澀。 – crvv

+1

確實,對於32位'int'你是對的。儘管只有一小部分C++程序員知道這一點。 – Bathsheba

+0

@crvv我認爲引發大多數人的一點是使用無符號類型只適用於十六進制到八進制文字。如果一個十進制整數文字對於'int'來說太大了,它會選擇下一個更大的有符號整數,如果十六進制和八進制符合,並且如果不符合則是下一個較大的有符號整數。 – NathanOliver