Как целые числа брошены к байтам в Java?

Я знаю, что Java не позволяет неподписанные типы, таким образом, я задавался вопросом, как он бросает целое число к байту. Скажите, что у меня есть целое число со значением 255, и я бросил целое число к байту. Значение представлено в байте 11111111? Другими словами, значение рассматривают больше как целое число на 8 битов со знаком, или разве оно просто непосредственно копирует последние 8 битов целого числа?

19
задан Koray Tugay 18 December 2014 в 15:49
поделиться

4 ответа

Это называется сужающим примитивным преобразованием. Согласно спецификации:

Сужающее преобразование знакового целого в интегральный тип T просто отбрасывает все биты самого низкого порядка, кроме n, где n - количество битов, используемых для представления типа T. Помимо возможной потери информации о величине числового значения, это может привести к тому, что знак результирующего значения будет отличаться от знака входного значения.

Таким образом, это второй вариант, который вы перечислили (прямое копирование последних 8 бит).

Из вашего вопроса я не уверен, знаете ли вы, как представляются знаковые интегральные значения, поэтому на всякий случай отмечу, что значение байта 1111 1111 равно -1 в системе дополнения до двух (которую использует Java).

24
ответ дан 30 November 2019 в 03:43
поделиться

или просто копирует последние 8 бит целого числа

да, так работает приведение

{{1} }
4
ответ дан 30 November 2019 в 03:43
поделиться

Просто мысль по поводу сказанного: Всегда маскируйте ваше целое число при преобразовании в байты с помощью 0xFF (для ints). (Предполагая, что myInt были присвоены значения от 0 до 255).

например,

char myByte = (char)(myInt & 0xFF);

почему? Если myInt больше 255, простое приведение к байту вернет отрицательное значение (дополнение 2), что вам не нужно.

1
ответ дан 30 November 2019 в 03:43
поделиться
int i = 255;

byte b = (byte)i;

Таким образом, шестнадцатеричное значение равно 0xFF, а десятичное значение будет -1.

int i = 0xff00;

byte b = (byte)i;

Теперь значение b равно 0x00. Это показывает, что java принимает последний байт целого числа. т.е. последние 8 бит, но это подписано.

4
ответ дан 30 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

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