Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> арифметические операции с Byte/byte 
:(
    Опции темы
underW
Дата 3.10.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: нет
Всего: 3



Есть вот такой код:
Код

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 выполняется правильно. 
Тут вообще у меня нету логического объяснения, почему мы получаем ошибку. 

Прошу помощи.
PM MAIL   Вверх
le_chat
Дата 3.10.2010, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



Код

        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; // здесь выполняется неявное приведение типов


PM MAIL   Вверх
underW
Дата 4.10.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: нет
Всего: 3



спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.