2016-09-20 3 views
3

в C++, у меня есть следующий код:Почему маскирование отрицательного числа приводит к положительному числу?

int x = -3; 
x &= 0xffff; 
cout << x; 

Это производит

65533 

Но если убрать негатив, так что у меня есть это:

int x = 3; 
x &= 0xffff; 
cout << x; 

Я просто получить 3 в результате

Почему первый результат не произвести отрицательное число? Я ожидал бы, что -3 будет знаком, расширенным до 16 бит, который все равно должен дать отрицательное число с добавочным номером, учитывая, что все эти расширенные биты будут равны 1. Следовательно, самым значительным битом будет 1.

ответ

5

Похоже, ваша система использует 32-битные int s с дополнительным представлением негативов.

Константа 0xFFFF охватывает наименее значимые два байта, причем верхние два байта равны нулю.

Значение -3 является 0xFFFFFFFD, так маскируя его с 0x0000FFFF вы получаете 0x0000FFFD или 65533 в десятичной системе счисления.

Положительный 3 является 0x00000003, так маскирование с 0x0000FFFF дает 3 спину.

Вы получите результат, ожидаемый, если вы укажете 16-битный тип данных, например.

int16_t x = -3; 
x &= 0xffff; 
cout << x; 
+0

Не могли бы вы объяснить, почему 0xFFFD больше не находится в форме дополнений? – Dillydill123

+0

@ Dillydill123, потому что верхние 2 байта 0xffff равны 0. Попробуйте использовать 32-битную маску (т. Е. 0xffffffff), и она должна сохранить знак. – sashang

+0

Имеет смысл! спасибо – Dillydill123

0

В вашем случае int более 2 байтов. Вероятно, вы работаете на современном процессоре, где обычно в эти дни целое число составляет 4 байта (или 32 бита)

Если вы посмотрите, как система хранит отрицательные числа, вы увидите, что это дополнительное число. И если вы берете только последние 2 байта, так как ваша маска равна 0xFFFF, вы получите только ее часть.

ваши 2 варианта:

  1. использование короткий intstead ИНТ. Обычно его половина целого числа, и будет только 2 укусов
  2. использовать большую маску, как 0xFFFFFFFF, что она охватывает все биты вашего целого

Примечание: Я использую «обычно», поскольку количество бит в ИНТЕ и короткий зависит от вашего процессора и компилятора.

Смежные вопросы