2016-11-01 60 views
0

我是使用按位運算符和布爾類型的初學者。我可能是錯的,但我認爲bool類型是用1位表示的,可以從{0,1}中取值。所以,我用這樣一個變量嘗試了NOT(〜)運算符,結果對我來說很奇怪。 例如。對於按位不用布爾變量

bool x = 0; 
    cout << (~x); 

我得到-1。 (我預期1)你能告訴我我錯在哪裏,爲什麼只有!操作符會反轉該值(從0到1,從1到0)?

回答

1

大多數處理器沒有1個位寬通用寄存器,所以當你使用一個布爾它佔用任何默認寄存器大小是平臺(大多數Intel和ARM的電腦,即64位,這些天,但也許32在一些嵌入式系統上)。當你否定某些全爲零的東西時,你會得到全1。在twos complement這將評估爲-1以帶符號的十進制數。長話短說,你的布爾是一個真正的int並且〜0是-1

+0

說明需要一些輕微的調整。並非所有的編譯器實現都使用二進制補碼。 –

0

!運算符是一個邏輯運算符 - 因此0(false)被否定爲1(真)。

~運算符是一個按位運算符 - 因此每一位都是否定的。 A bool,而在概念上是單個位 - 可能會導致int類型的表達式。因此,你真的否定0.....000,這是1...111,這是-1(見二的補碼)。

0

boolx在表達式~x使用時是implicitly convertedint。而絕大多數的電腦使用two's complement表示有符號整數,其中~0等於-1。

!運營商如此定義:!x已鍵入bool而非int,所以不會出現此問題。