Понимание Java без знака числа - PullRequest
5 голосов
/ 02 августа 2010

Я хочу понять, как преобразовать число со знаком в беззнаковое.

Допустим, у меня есть это:

byte number = 127; // '1111111'

Чтобы сделать его без знака, мне нужно выбрать «большие» данныевведите 'short' и примените оператор AND со значением 0x00ff.

short number2;  
number2 = number & 0x00ff;

Почему это делает число без знака?

Ответы [ 3 ]

4 голосов
/ 02 августа 2010

У Java на самом деле нет беззнаковых примитивов.

Значение 127 фактически представлено как '01111111', первый бит является знаком (0 - положительный).

Байт без знака будетбыть в состоянии содержать значения от 0 до 255, но 127 является максимумом для байта со знаком.Поскольку байт имеет 8 битов, а подписанный использует один для хранения знака.Поэтому, если вы хотите представить значения больше 127, вам нужно использовать больший тип с большим количеством битов.Больший тип также имеет зарезервированный бит для знака, но он содержит не менее 8 битов, используемых для фактических значений, поэтому вы можете представить значение 255.

При этом следует избегать использования байта и короткогопотому что есть проблемы с ними.Вы заметите, что я приведу результат к короткому, поскольку операторы действительно возвращают int.Вы должны просто придерживаться int и long в java, поскольку они реализованы лучше.

Редактировать: оператор AND делает его беззнаковым, так как знаковый бит является первым битом короткого замыкания, и вы копируете 8 битов, содержащихзначение байта до последних 8 бит короткого замыкания.Таким образом, если у вас отрицательное число, первый бит, равный 1 (это означает, что он отрицательный), фактически становится частью значения.И короткое значение всегда будет положительным, поскольку его знаковый бит находится на двух высших значениях степени двойки, на которые влияет короткое замыкание.

 byte:             10101101
                    ||||||| <- actual value
short:     0000000010101101
            ||||||||||||||| <- actual value

Редактировать 2: Обратите внимание, что, поскольку отрицательные значения используют дополняющее представление двух значение может не соответствовать ожидаемому.все положительные значения остаются прежними.Но -128 = 0x10000000 станет 128-127 = 0x10000001 станет 129и так до тех пор, пока -1 = 0x11111111, который станет 255

1 голос
/ 02 августа 2010

Java не имеет неподписанных типов данных.Вы просто переключаетесь на «больший» тип данных, и все.

0 голосов
/ 02 августа 2010

Если вы просто перейдете от отрицательного байта к int, int тоже будет отрицательным.Таким образом, вы берете отрицательное значение int (или короткое в вашем примере) и устанавливаете для старшего 3 байта (int) значение 0x00.

...