Сужающее приведение типов

Добрый день. Объясните пожалуйста, каким образом происходят подобные сужающие преобразования на примере: например, есть число типа long, равное 130L. Мы его преобразовываем к byte и получаем -126. В книге написано, что отбрасываются биты старше 1го байта, но я не могу понять как мы получили отрицательное число. Поясните, пожалуйста, в явной двоичной форме. Спасибо.

1 ответов


Ну сначала на десятичных числах: тип byte может принимать значения от -128 до 127 (от -2^n до (2^n) - 1, n=8) . Поэтому он не может принять значение 130 - происходит переполнение, для числа 128 byte примет значение -128, для 129 примет -127, для 130 примет -126.

Теперь в двоичном виде: после приведения 130 в двоичный вид и отбрасывания битов старше 1 байта получаем число 10000010. В знаковых типах старший бит отвечает за знак числа: 1 - минус, 0 - плюс. Здесь, как видим, старший бит равен 1, значит число отрицательное. Находим дополнительный код для этого числа. Находится он так: инвертируются все биты и прибавляется 1. Получаем 01111101 + 1 = 01111110 и это равно 126. Следовательно под числом 10000010 представлено десятичное число -126.