[英]When right shift operation >> shift sign bit and when it not?
我的問題是為什么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
a >> 1
很無聊。 它只是針對負數a
的signed
類型定義的實現。
(a & 0xaaaaaaaa) >> 1
更有趣。 對於你有32位int
(以及其他)的可能情況, 0xaaaaaaaa
是一個unsigned
文字(十六進制文字的模糊規則)。 因此,由於C ++類型提升規則a
被轉換為unsigned
類型,因此表達式a & 0xaaaaaaaa
的類型是unsigned
。
為酒吧測驗提出了一個很好的問題。
參考: http : //en.cppreference.com/w/cpp/language/integer_literal ,特別是“文字的類型”表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.