Как целые числа приводятся к байтам в 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 бит, но это подписали.


или он просто копирует последний 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