Почему byte b = (byte) 0xFF
равно integer
-1
?
Пример:
int value = byte b = (byte) 0xFF;
System.out.println(value);
он напечатает -1
?
Почему byte b = (byte) 0xFF
равно integer
-1
?
Пример:
int value = byte b = (byte) 0xFF;
System.out.println(value);
он напечатает -1
?
Байты подписываются на Java. В двоичном 0x00 равен 0, 0x01 равно 1 и так далее, но все 1s (т.е. 0xFF) равно -1, 0xFE равно -2 и так далее. См. Два дополнения, которые являются используемым механизмом двоичного кодирования.
b
повышается до int
при определении перегрузки system.out.println
для вызова.
Все байты в Java подписаны.
Подписанный байт 0xff
представляет значение -1
. Это связано с тем, что Java использует два дополнения для представления подписанных значений. Подписанный байт 0xff
представляет -1
, потому что его старший бит равен 1
(поэтому он представляет отрицательное значение), а его значение -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
.
возможно, ваше замешательство возникает из-за того, что (byte)0xFF
как-то равно (int)0xFFFFFFFF
. Здесь происходит продвижение от более мелких к более крупным подписанным типам, заставляя меньшее значение быть расширением знака, посредством чего самый старший бит копируется ко всем новым битам продвинутого значения. беззнаковый тип не будет расширяться по знаку, они будут иметь нулевой размер, новые бит всегда будут равны нулю.
Если это поможет вам усвоить его, подумайте об этом таким образом, у каждого целого любого размера также есть некоторые "phantom" биты, которые слишком значительны для представления. они есть, просто не сохраняются в переменной. отрицательное число имеет эти биты отличные от нуля, а положительные числа имеют все нули для бит phantom, когда вы продвигаете меньшее значение к большему, те phantom биты становятся реальными битами.
Если вы используете подписанный int, то 0xFF = -1 из-за 2-дополнения.
Эта статья wiki объясняет это хорошо, см. таблицу справа: http://en.wikipedia.org/wiki/Two%27s_complement
Поскольку Java (и большинство языков) представляют отрицательные целочисленные значения, используя двухсоставную математику. В двухзначном дополнении 0xFF (11111111) представляет (в подписанном int) значение -1.
Это не просто Java, который выполняет 2 дополнения к математике. Таким образом, каждый микропроцессор и DSP, о которых я могу думать, делают математику. Таким образом, это означает, что каждый язык программирования представляет его.
приведено по модулю
byte = 256 0xff = 255
255/256 → остаток 255
Итак, 255 - 256 = -1
Простая логика Приветствия