Что происходит, когда я назначаю значение больше байта? - PullRequest
1 голос
/ 05 мая 2019

Что происходит, когда я назначаю значение больше байта?

Согласно официальной документации оракула, Байт равен

  • Байт:Байтовый тип данных представляет собой 8-разрядное целое число со знаком в виде двоичного числа со знаком.Он имеет минимальное значение -128 и максимальное значение 127 (включительно).Байтовый тип данных может быть полезен для сохранения памяти в больших массивах, где экономия памяти действительно имеет значение.Их также можно использовать вместо int, где их пределы помогают уточнить ваш код;тот факт, что диапазон переменной ограничен, может служить формой документации

Мой код

public class B
{

    public static void main(String args[])
    {
        byte b;
        b=(byte)129;
        System.out.println("b="+b);

    }
}   

Вывод:

b=-127

Что происходит, когда я назначаю значение больше байта.Компилятор Java сообщит об ошибке.Я пойду, если приведу это значение к байту

byte b = (byte) 128;

Я не понимаю вывод этой программы?

Ответы [ 3 ]

5 голосов
/ 05 мая 2019

Для байтового типа у вас есть только 8 бит для хранения значения. Вы можете иметь только 256 различных значений (2 ^ 8 = 256). Java представляет отрицательные значения с '1' в качестве старшего бита:

-128 (dec) => 10000000 (bit)
-127 (dec) => 10000001 (bit)
... 
-1   (dec) => 11111111 (bit)
0    (dec) => 00000000 (bit)
+1   (dec) => 00000001 (bit)
+127 (dec) => 01111111 (bin)

Когда вы пытаетесь установить значение, для хранения которого требуется более одного байта, происходит установка младшего байта в значение байта:

+129 (dec) => 00000000 00000000 00000000 10000001  (int representation)

but 10000001 (bit) is -127 (dec) in byte representation of java type (as described above)

Чтобы лучше понять проблему переполнения в Java, см. Статью: https://medium.com/@jeanvillete/java-numeric-overflow-underflow-d6b206f96d88

3 голосов
/ 05 мая 2019

129 является целочисленным литералом и, поскольку за ним не следует L или l, он имеет тип int. Это имеет 32 бита (4 байта):

0000 0000  0000 0000  0000 0000  1000 0001

Когда приведен к byte 5.1.3. Выполняется сужающее примитивное преобразование , которое отбрасывает все, кроме младших 8 битов, поэтому значения вписываются в byte.

В вашем примере мы закончим только младшими 8 битами

1000 0001

, поскольку в Java для представления byte используется дополнение до двух, это число считается отрицательным, поскольку установлен старший бит.

Если значение было 257, его двоичное представление было бы:

0000 0000  0000 0000  0000 0001  0000 0001

преобразовано в byte как:

0000 0001

или просто +1 (старший бит не установлен).

Ссылки:

0 голосов
/ 05 мая 2019

Тип байта байта имеет 1 байт в соответствии с именем.таким образом, его диапазон составляет от -127 до +126 (то есть емкость равна 256).Следовательно, +129 не может быть сохранено в байтовом типе данных.поэтому +129 усекается до -127.

...