Просто дополнение к ответу Эриксона:
По его словам, целые числа со знаком хранятся как два дополнения к их соответствующему положительному значению на большинстве компьютерных архитектур.
То есть все 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
Нам не нужно добавлять дополнительные нули перед ним, поскольку мы уже достигли максимума в 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.