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