Java - Маскирующий бит знака вызывает неожиданное поведение - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующее значение:

int x = -51232;

Целые числа Java являются 32-битными, поэтому в двоичном виде это должно быть следующим:

10000000000000001100100000100000

Бит знака слева установлен на 1, поскольку x отрицательно.

Затем я делаю операцию

x = (x & Integer.MAX_VALUE);

Integer.MAX_VALUE равно 2147483647, а в двоичном виде это будет:

01111111111111111111111111111111

0 слева, потому что значение положительное.

Так почему x & Integer.MAX_VALUE дает 2147432416? Оператор AND должен извлекать только те биты, которые x и Integer.MAX_VALUE имеют общее, что должно быть эквивалентно -x (поскольку они не используют один и тот же бит знака).

Что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 11 июля 2019

Ваше недоразумение вызвано отсутствием знаний о том, как отрицательные целые числа представлены в двоичном коде в Java.Вы должны прочитать о дополнении 2.

10000000000000001100100000100000 это не двоичное представление -51232.

11111111111111110011011111100000 это.

Икогда вы запускаете побитовое AND, вы получаете:

11111111111111110011011111100000 (-51232)
01111111111111111111111111111111 (Integer.MAX_VALUE)
--------------------------------
01111111111111110011011111100000 (2147432416)

Вот двоичное представление -51232 рядом с двоичным представлением 51232. Вы можете видеть, что их сумма равна 2 32 .это всегда имеет место с дополнением 2, для любой пары int s x и -x.

00000000000000001100100000100000 (-51232)
11111111111111110011011111100000 (51232)
0 голосов
/ 11 июля 2019

Целые числа хранятся в двух дополнениях: https://en.m.wikipedia.org/wiki/Two%27s_complement.

Таким образом, хотя самый левый бит указывает на отрицательные числа, он на самом деле не является знаковым битом, как это было бы для чисел с плавающей запятой в обычном представлении.

Основная причина этого представления заключается в том, что он позволяет легко выполнять сложение и вычитание среди прочего на аппаратном уровне.

Не следует, чтобы с двумя дополнительными обозначениями -1 представлялся всем битом, установленным в 1.

...