Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > арифметические операции с Byte/byte


Автор: underW 3.10.2010, 17:02
Есть вот такой код:
Код

Byte a= Byte.MAX_VALUE;
byte b=100;

a++; 
b++;

++a;
--b;

a=+a; 
b=+b;

a=-a; 
b=-b;

a=a+1; 
b=b+1;

a+=1; 
b+=1;

В книжках пишут, что:
Цитата

перед началом выполнения выражения, все значения, char, byte и short, преобразуются в int. Затем, если хотя бы один из операндов принадлежит типу long, все выражение преобразуется в long.... и тд.

Разбирая код, видим, что постфиксный/префиксный инкремент/декремент выполняются правильно, ошибок нет. 
Инкремент и декремент - это операторы, соответственно 
Код

a++; 
b++;

++a;
--b;

это есть выражения, но как видим, преобразования к int не происходит. Почему?
Разбираем дальше: используем в выражении унарный оператор +(-)
Код

a=+a; 
b=+b;

a=-a; 
b=-b;

все строки содержат ошибку, ибо происходит преобразование к типу int. Хорошо.Вопросов нет.
Выражение с бинарным оператором +(-)
Код

a=a+1; 
b=b+1;
 
Ошибка, тоже самое преобразование к int.Все ясно.
И последний кусок кода:
Код

a+=1; 
b+=1;

строка 1 содержит ошибку (The operator += is undefined for the argument type(s) Byte, int), строка 2 выполняется правильно. 
Тут вообще у меня нету логического объяснения, почему мы получаем ошибку. 

Прошу помощи.

Автор: le_chat 3.10.2010, 21:40
Код

        byte c = Byte.MAX_VALUE;
        c = (byte) (c+1);

        byte a = Byte.MAX_VALUE;
        a++;

байт код этих операций одинаковый. следовательно  при a++ преобразование к int происходит.

В последнем случае используется автобоксинг. Если разложить все операции, то станет понятно почему так происходит:

Код

       // a+=1 выполняется как a= a + 1 
       // это раскладывается следующим образом:
       
        int d = a.byteValue();
        d = d + 1;
        a = Byte.valueOf( d ); // такого метода у класса Byte нет. Поэтому автоматически свернуть это выражение компилятор не может.
        // требуется явное преобразование:  a = Byte.valueOf( (byte) d )

        b+=1; // здесь выполняется неявное приведение типов


Автор: underW 4.10.2010, 09:40
спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)