Добавить байты с приведением типа, Java - PullRequest
8 голосов
/ 22 марта 2012

Я пытаюсь добавить два значения в массив байтов.Это мой код:

byte[] ars = {3,6,9,2,4};
ars[0] = (byte)ars[0] + (byte)ars[4];
System.out.println( ars[0] );

Я получаю эту ошибку при компиляции:

Main.java:9: possible loss of precision
found   : int
required: byte
    ars[0] = (byte)ars[0] + (byte)ars[4];
                          ^
1 error

Любая помощь, как всегда, высоко ценится.

Ответы [ 7 ]

12 голосов
/ 22 марта 2012

близко, но немного выключено.

ars[0] = (byte)(ars[0] + ars[4]);

имейте в виду, ars[0] и ars[4] уже являются байтами, поэтому нет необходимости приводить их к байтам.

Вместо этого приведите результат суммирования к байту.

11 голосов
/ 22 марта 2012

В Java сумма двух byte s равна int.Это происходит потому, что, например, два числа до 127 могут добавить к числу более 127, и по умолчанию Java использует int s почти для всех чисел.

Чтобы удовлетворить компилятору, замените соответствующую строкуэто:

ars[0] = (byte)(ars[0] + ars[4]);
4 голосов
/ 03 ноября 2012

Я разбирался с этим вопросом некоторое время назад и собрал все находки здесь: http://downwithjava.wordpress.com/2012/11/01/explanation-to-teaser-2/

Мы все знаем, что байты преобразуются в целые во время арифметической операции. Но почему это происходит? Потому что у JVM нет арифметических инструкций, определенных для байтов. Переменные байтового типа должны быть добавлены сначала путем числового преобразования их в тип int, а затем добавления. Почему в JVM нет арифметических инструкций для типа байтов? В спецификации JVM четко сказано:

Виртуальная машина Java обеспечивает наиболее прямую поддержку данных типа int. Это отчасти в ожидании эффективных реализаций стеков операндов виртуальной машины Java и массивов локальных переменных. Это также мотивируется частотой данных int в типичных программах. Другие интегральные типы имеют менее прямую поддержку. Например, не существует байтовой, символьной или краткой версий инструкций сохранения, загрузки или добавления.

4 голосов
/ 22 марта 2012
public static void main(String args[]){
    byte[] ars = {3,6,9,2,4};
    ars[0] = (byte)(ars[0] + ars[4]);
    System.out.println( ars[0] );
}

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

2 голосов
/ 22 марта 2012
byte[] ars = {3,6,9,2,4};
        ars[0] = (byte) (ars[0] + ars[4]);
        System.out.println( ars[0] );

Это будет работать, попробуйте

2 голосов
/ 22 марта 2012
ars[0] = (byte)(ars[0] + ars[4]);
2 голосов
/ 22 марта 2012

Пожалуйста, замените эту строку следующим

ars[0] = (byte)(ars[0]+ars[4]);
...