То, почему байт b = (байт) 0xFF, равняется целому числу-1?

Я использовал URL обновления, и я установил адаптер JavaHL, сам проект Subclipse и БЕТА адаптера SVNKit.

После этого это хорошо работало для меня, это для надежды платформы Linux, что это работает на Вас.

21
задан James Cronen 5 November 2009 в 02:54
поделиться

6 ответов

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

19
ответ дан 29 November 2019 в 20:43
поделиться
  1. b повышается до int при определении того, какую перегрузку system.out.println вызывать.

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

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

13
ответ дан 29 November 2019 в 20:43
поделиться

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

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

5
ответ дан 29 November 2019 в 20:43
поделиться

If you are using a signed int then 0xFF = -1 due to the 2-complement.

This wiki article explains it well, see the table on the right: http://en.wikipedia.org/wiki/Two%27s_complement

3
ответ дан 29 November 2019 в 20:43
поделиться

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

1
ответ дан 29 November 2019 в 20:43
поделиться

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

-1
ответ дан 29 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: