Почему Java может хранить 0xff000000 как int?

Максимальное значение целого числа в Java - 2147483647, поскольку целые числа Java подписаны, верно?

0xff000000 имеет числовое значение 4278190080.

Но я вижу такой код Java:

int ALPHA_MASK = 0xff000000;

Кто-нибудь может просветить меня, пожалуйста?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
0
9 013
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

дополнительный бит для знака

Интервалы 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.

@Kitsune (и / или любой, кто этого еще не знает): это хорошее объяснение. Чтобы прочитать его, может потребоваться несколько раз, но я рекомендую вам прочитать его, пока он не станет действительно осмысленным.

Bill K 26.11.2008 02:47

Вероятно, стоит отметить кое-что - этот код не предназначен для использования в качестве целого числа с числовым значением; Назначение битовой маски - отфильтровать альфа-канал из 32-битного значения цвета. Эту переменную действительно не следует даже рассматривать как число, просто как двоичную маску с включенными старшими 8 битами.

Другие вопросы по теме