Я знаю, что Java не позволяет неподписанные типы, таким образом, я задавался вопросом, как он бросает целое число к байту. Скажите, что у меня есть целое число со значением 255, и я бросил целое число к байту. Значение представлено в байте 11111111? Другими словами, значение рассматривают больше как целое число на 8 битов со знаком, или разве оно просто непосредственно копирует последние 8 битов целого числа?
Это называется сужающим примитивным преобразованием. Согласно спецификации:
Сужающее преобразование знакового целого в интегральный тип T просто отбрасывает все биты самого низкого порядка, кроме n, где n - количество битов, используемых для представления типа T. Помимо возможной потери информации о величине числового значения, это может привести к тому, что знак результирующего значения будет отличаться от знака входного значения.
Таким образом, это второй вариант, который вы перечислили (прямое копирование последних 8 бит).
Из вашего вопроса я не уверен, знаете ли вы, как представляются знаковые интегральные значения, поэтому на всякий случай отмечу, что значение байта 1111 1111 равно -1 в системе дополнения до двух (которую использует Java).
или просто копирует последние 8 бит целого числа
да, так работает приведение
{{1} }Просто мысль по поводу сказанного: Всегда маскируйте ваше целое число при преобразовании в байты с помощью 0xFF (для ints). (Предполагая, что myInt были присвоены значения от 0 до 255).
например,
char myByte = (char)(myInt & 0xFF);
почему? Если myInt больше 255, простое приведение к байту вернет отрицательное значение (дополнение 2), что вам не нужно.
int i = 255;
byte b = (byte)i;
Таким образом, шестнадцатеричное значение равно 0xFF, а десятичное значение будет -1.
int i = 0xff00;
byte b = (byte)i;
Теперь значение b равно 0x00. Это показывает, что java принимает последний байт целого числа. т.е. последние 8 бит, но это подписано.