



дополнительный бит для знака
Интервалы Java - это двойное дополнение
Старший бит - это знаковый бит. Установка обозначает отрицательное число: -16777216.
Java, как и большинство языков, хранит числа со знаком в форме 2 дополнения. В этом случае вычитание 231 или 2147483648 из 0x7F000000 или 2130706432 дает -16777216.
ints подписаны на Java.
Просто дополнение к ответу Эриксона:
По его словам, целые числа со знаком хранятся как два дополнения к их положительному значению на большинстве компьютерных архитектур.
То есть все 2 ^ 32 возможных значения делятся на два набора: один для положительных значений, начинающихся с 0-битного бита, и один для отрицательных значений, начинающихся с 1.
А теперь представьте, что мы ограничены 3-битными числами. Давайте расставим их забавным образом, который через секунду станет понятен:
000
111 001
110 010
101 011
100
Вы видите, что все числа в левой части начинаются с 1 бита, тогда как в правой части они начинаются с 0. В соответствии с нашим предыдущим решением объявить первое как отрицательное, а второе как положительное, мы видим, что 001 , 010 и 011 - единственно возможные положительные числа, тогда как 111, 110 и 101 - их соответствующие отрицательные эквиваленты.
Теперь, что нам делать с двумя числами, которые находятся вверху и внизу соответственно? 000, очевидно, должно быть равно нулю, а 100 будет наименьшим отрицательным числом из всех, не имеющим положительного эквивалента. Подвести итоги:
000 (0)
111 001 (-1 / 1)
110 010 (-2 / 2)
101 011 (-3 / 3)
100 (-4)
Вы могли заметить, что вы можете получить битовый шаблон -1 (111), отрицая 1 (001) и добавляя к нему 1 (001): 001 (= 1) -> 110 + 001 -> 111 (= -1)
Возвращаясь к вашему вопросу:
0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000
Нам не нужно добавлять дополнительные нули перед ним, поскольку мы уже достигли максимума в 32 бита. Кроме того, очевидно, что это отрицательное число (поскольку оно начинается с 1-битного), поэтому теперь мы собираемся вычислить его абсолютное значение / положительный аналог:
Это означает, что мы возьмем два дополнения
1111 1111 0000 0000 0000 0000 0000 0000
который
0000 0000 1111 1111 1111 1111 1111 1111
Затем добавляем
0000 0000 0000 0000 0000 0000 0000 0001
и получить
0000 0001 0000 0000 0000 0000 0000 0000 = 16777216
Следовательно, 0xff000000 = -16777216.
Вероятно, стоит отметить кое-что - этот код не предназначен для использования в качестве целого числа с числовым значением; Назначение битовой маски - отфильтровать альфа-канал из 32-битного значения цвета. Эту переменную действительно не следует даже рассматривать как число, просто как двоичную маску с включенными старшими 8 битами.
@Kitsune (и / или любой, кто этого еще не знает): это хорошее объяснение. Чтобы прочитать его, может потребоваться несколько раз, но я рекомендую вам прочитать его, пока он не станет действительно осмысленным.