2009-11-05 7 views

ответ

3

Если вы используете подписанный int, то 0xFF = -1 из-за 2-дополнения.

Эта вики статья объясняет это хорошо, смотрите таблицу справа: http://en.wikipedia.org/wiki/Two%27s_complement

1

Поскольку Java (и в большинстве языков) представляют отрицательные целые значения, используя two's-complement math. В двухзначном дополнении 0xFF (11111111) представляет (в подписанном int) значение -1.

17

Байты подписываются на Java. В двоичном 0x00 равен 0, 0x01 равно 1 и так далее, но все 1s (т.е. 0xFF) равно -1, 0xFE равно -2 и так далее. См. Two's complement, который является используемым механизмом двоичного кодирования.

+2

И Java расширяет знак при расширении байта до int. http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension – shf301

+0

Фактическое расширение знака - это правильная причина. –

13
  1. b способствует к int при определении перегрузки system.out.println позвонить.

  2. Все байты в Java подписаны.

  3. Подписанный байт 0xff представляет значение -1. Это связано с тем, что Java использует two's complement для представления подписанных значений. Записанный байт 0xff представляет -1, поскольку его старший бит равен 1 (поэтому он представляет отрицательное значение), а его значение равно -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1.

-1

Его не просто Java, который делает математику дополнений 2. Таким образом, каждый микропроцессор и DSP, о которых я могу думать, делают математику. Таким образом, это означает, что каждый язык программирования представляет это.

+2

Строго говоря, некоторые языки (например, C и C++) не указывают, какое представление используется для целых чисел. Это специфичная платформа. с другой стороны, Java * * задает представление дополнения 2. –

5

Возможно, ваше замешательство связано с тем, почему (byte)0xFF как-то равно (int)0xFFFFFFFF. Здесь происходит продвижение от более мелких к более крупным подписанным типам, потому что меньшее значение должно быть . Знак расширился, в результате чего самый старший бит копируется во все новые бит продвинутого значения. беззнаковый тип не будет расширяться по знаку, они будут иметь нулевой размер, новые бит всегда будут равны нулю.

Если это поможет вам проглотить его, подумайте об этом таким образом, у каждого целого любого размера также есть некоторые «фантомные» биты, которые слишком значительны для представления. они есть, просто не сохраняются в переменной. отрицательное число имеет эти биты отличные от нуля, а положительные числа имеют все нули для фантомных битов, когда вы продвигаете меньшее значение к большему, эти фантомные биты становятся реальными битами.

-1

уменьшается по модулю

байт = 256 0xFF = 255

255/256 -> остаточные 255

So 255 - 256 = -1

Простая логика Приветствия