[英]I am not getting the answer I expect using the Bitwise NOT operator. Would appreciate some help
我正在通過一本C ++書籍嘗試學習一些東西。 我被一件事困住了,按位不是。 我了解它會顛覆所有方面,但是它在C ++中的預期效果卻不盡人意。 這是相關的代碼。
letter = 'A'; // dec = 65 hex = 0x41 binary = 0100 0001
cout << endl << "Bitwise NOT" << endl;
cout << "Letter: " << letter << " = " << insertSpaces(toBinary(letter)) << endl;
int notletter = ~letter;
cout << "~Letter: " << notletter << endl;
string insertSpaces(string binary)
// insert spaces into a binary number string for readability
{
int pos = 4;
int len = binary.length();
while (pos < len)
{
binary.insert(pos, " ");
pos = pos + 5; // 5 because it includes space
len++; // space makes length longer
}
return binary;
}
string toBinary(int letter)
{
string result = "";
while (letter > 0)
{
result = toString(letter % 2) + result;
letter /= 2;
}
int rem = result.length() % 4;
if (rem > 0)
{
int zeros = 4 - rem;
for (int i = 0; i < zeros; i++)
result = "0" + result;
}
return result;
}
這是輸出。
Bitwise NOT
Letter: A = 0100 0001
~Letter: -66
答案應該是190或1011 1110(二進制),為什么我得到-66? 我正在使用Visual C ++ 2010。
使用無符號整數而不是有符號整數。 之所以得出負數,是因為當今大多數計算機都使用二進制補碼 。
這是按位前后數據的樣子:
before | after
0100 0001 | 1011 1110
(實際上,那里可能有32位,因為您使用的是int
而不是char
;此處最好使用的類型可能是uint8_t
)
在二進制補碼中,如果最高有效位為1,則數字為負。 在二的補語中,要取反一個數字,您可以按位取非,然后加1。如果您取1011 1110
並將其取反,則得到0100 0001
。 現在,您添加一個,結果為0100 0010
。 如果將其轉換為十進制數,則得到66。由於第一位為1,所以減去負號,得到-66,這是意外值。
您正在處理Two's Complement中的一個帶符號的數字。 該值已超過最大正值(127),並包裝到負空間。
您可以將其打印為無符號字符/整數(即(unsigned int)notletter
或static_cast<unsigned int>(notletter)
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.