2014-09-12 1 views

ответ

0

Нет инструкций для выполнения операции по типу byte. Скорее набор инструкций для типа int используется для работы по boolean, byte, char и short. http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.11.1 Также Тип данных более высокого размера (занимающий больше памяти) не может быть присвоен типу данных меньшего размера. Это не делается неявно JVM и требует явного литья; операция литья, выполняемая программистом

Результатом будет целое число. Для этого вы должны сделать

byte a = 10; 
byte b = 20; 
byte c = (byte) (a + b); //u will have to typecast int to byte 

System.out.println(c); 
+0

Я знаю концепцию typecast, но то, что я не могу понять, - это значение байта от -128 до 127 значение C, которое также падает под ним тогда, почему ошибка? – user3651808

+0

Потому что именно так разработана виртуальная машина Java. Нет набора инструкций для выполнения операции по типу байта. Скорее набор команд для типа int используется для операции с булевым, байтовым, char и коротким типами. – kirti

+0

Вы уверены, что 'short' не имеет оператора сложения? Я помню, что 'short + short' работал на Java7, но у меня нет Java7 на моем ПК здесь – msrd0

5

CompileTime против RunTime

а, б байты и байты не имеют оператора сложения. Во время выполнения, так как a, b не являются окончательными, и имеет место целочисленное сложение, результатом которого является int. И вы пытаетесь присвоить его байту. Это приводит к ошибке компиляции.

byte c = (byte)a+b; 

И как примечание стороны. попробуйте изменить свой код, как

final byte a = 10; 
final byte b = 20; 
byte c = a + b; 

Это нормально компилируется из-за сужение преобразования, и это возможно, если все операнды являются постоянными величинами в выражении.

+0

Поскольку Java 8, достаточно, когда они фактически окончательные, и они находятся в коде OP в – msrd0

+0

@ msrd0 [Да, я согласен с вами.] (Http://codeinventions.blogspot.in/2014 /07/difference-between-final-and.html) –

0

Java преобразует результат арифметических операций в int по умолчанию. Попробуйте это:

public static void main(String... s) 
{ 

    byte a = 10; 
    byte b = 20; 
    byte c = (byte) (a + b); 

System.out.println(c); 
} 

То (byte) изменяет значение INT, возвращаемое (A + B) в виде байтового значения. Обычно этого не может быть сделано, так как диапазон int намного больше, чем диапазон байтов, поэтому произойдет потеря точности. Использование литья заставляет конвертировать, независимо от точности.

+1

, так что согласно вашему утверждению «Java преобразует результат арифметических операций в тип int по умолчанию» для всех переменных, таких как long, float, short ?? или просто в случае байта? – user3651808

1

Ошибка компиляции раз, если я изменю этот

byte c = a + b; 

в

byte c = (byte) (a + b); 

я получить выход

30 
1

Изменить

byte c = a + b; 

к

byte c = (byte)(a + b); 

Это работает для меня.

+0

Я знаю концепцию typecast, но то, что я не могу понять, так как значение байта составляет от -128 до 127 значение C, которое также 30 подпадает под него, то почему ошибка? – user3651808

+0

, потому что байт не получил дополнительного оператора, как сказал sᴜʀᴇsʜ ᴀᴛᴛᴀ. Его решение лучше, чем мое, вместо этого используйте его. – szabosanya1991

0

Вот Что происходит

byte a = 10; 

переменной а типа байт, созданного 10 присвоенной ему.

byte b = 20; 

переменной b байтового типа, назначенной ему 10.

byte c = a+b; 

a+b автоматически повышен до целого числа, так как теперь результат суммирования является целым числом, вы не можете присвоить целое число байт.

2

Вы должны наложить на byte. Поскольку a и b имеют тип байта, Java преобразует их в int, а затем результат int.

byte c = (byte) (a+b);