Как целые числа приводятся к байтам в Java?
Я знаю, что Java не позволяет беззнаковые типы, поэтому мне было интересно, как он бросает целое число в байт. Скажем, у меня есть целое число a со значением 255, и я приведу целое число к байту. Представлено ли значение в байте 11111111? Другими словами, обрабатывается ли значение как знаковое 8-битное целое число или оно просто копирует последние 8 бит целого числа?
7 ответов
Это называется сужающееся примитивное преобразование. Согласно спецификации:
сужающее преобразование целого числа со знаком в интегральный тип T просто отбрасывает все, кроме n биты самого низкого порядка, где n - количество бит, используемых для представления типа T. В дополнение к возможной потере информации о величине числового значения это может привести к тому, что знак результирующего значения отличаются от знака входного значения.
таким образом, это второй вариант, который вы указали (прямое копирование последних 8 бит).
Я не уверен в вашем вопросе, знаете ли вы, как представлены подписанные интегральные значения, поэтому просто для безопасности я укажу, что значение байта 1111 1111 равно -1 в двое дополняют system (который использует Java).
int i = 255;
byte b = (byte)i;
таким образом, значение be в hex равно 0xFF, но десятичное значение будет -1.
int i = 0xff00;
byte b = (byte)i;
значение b теперь равно 0x00. Это показывает, что java принимает последний байт целого числа. то есть. последние 8 бит, но это подписали.
просто мысль о том, что сказано: всегда маскируйте целое число при преобразовании в байты с помощью значение 0xFF (для ints). (Предполагая, что myInt было присвоено значение от 0 до 255).
например
char myByte = (char)(myInt & 0xFF);
почему? если myInt больше 255, просто typecasting to byte возвращает отрицательное значение (дополнение 2), которое вы не хотите.
for (int i=0; i <= 255; i++) {
byte b = (byte) i; // cast int values 0 to 255 to corresponding byte values
int neg = b; // neg will take on values 0..127, -128, -127, ..., -1
int pos = (int) (b & 0xFF); // pos will take on values 0..255
}
преобразование байта, содержащего значение больше 127 (i.e,. значения 0x80 через 0xFF) к int приводит к расширению знака бита высокого порядка значения байта (т. е. бит 0x80). Чтобы удалить "лишние" биты, используйте x & 0xFF; это заставляет биты выше 0x80 (т. е. биты 0x100, 0x200, 0x400,...) до нуля, но оставляет нижние 8 бит как есть.
вы также можете написать их; все они эквивалентны: int pos = ((int) b) & 0xFF; / / преобразовать b в int во-первых, после этого обнажайте высокие биты int pos = b & 0xFF; / / сделано как арифметика int - приведение не требуется
Java автоматически "продвигает" целочисленные типы, размер которых (в # бит) меньше, чем int к значению int при выполнении арифметики. Это делается для обеспечения более детерминированного результата (чем, скажем, C, который менее ограничен в своей спецификации).
возможно, вы захотите взглянуть на этот вопрос о кастинге "короткий".
байт 8 бит. 8 бит может представлять 256 чисел.(2 рейза до 8=256)
Теперь первый бит используется для знака. [если положительный, то первый бит=0, если отрицательный первый бит= 1]
предположим, вы хотите преобразовать целое число 1099 в байт. просто разделите 1099 на 256. остаток-это ваше байтовое представление int
примеры
1099/256 => остаток= 75
-1099 / 256 = > остаток=-75
2049/256 => остаток= 1
почему? посмотрите на это изображение http://i.stack.imgur.com/FYwqr.png
согласно моему пониманию, вы имели в виду
Integer i=new Integer(2);
byte b=i; //will not work
final int i=2;
byte b=i; //fine
в прошлом
Byte b=new Byte(2);
int a=b; //fine