Основни аритметични операции върху int - Java

Наскоро забелязах идиосинкразия на Java по отношение на основните аритметични операции в Java. Със следния код

byte a = 3;
byte b = 4;
byte c = a * b;

Получавам грешка при компилация „разминаване на типа“...

Дали основните аритметични операции в Java (+, -, *, /) се изпълняват само върху примитивни типове данни от int и по-висок ред (long, double и т.н.), докато аритметичните операции върху byte и short първо се прехвърлят към int и след това се оценяват ?


person mercurial    schedule 02.01.2013    source източник
comment
Добър въпрос. Честно казано не знаех отговора, но намерих това. mindprod.com/jgloss/multiplication.html   -  person Zutty    schedule 02.01.2013


Отговори (2)


Операциите върху byte, char и short се разширяват до int, освен ако компилаторът не може да определи, че стойността е в диапазона.

final byte a = 3, b = 4;
byte c = a * b; // compiles

final byte a = 3, b = 40;
byte c = a * b; // compiles

final int a = 3, b = 4;
byte c = a * b; // compiles !!

но

byte a = 3, b = 4;
byte c = a * b; // doesn't compile as the result of this will be `int` at runtime.

final byte a = 30, b = 40;
byte c = a * b; // doesn't compile as the value is too large, will be an `int`

BTW Това се компилира, въпреки че води до препълване. :]

final int a = 300000, b = 400000;
int c = a * b; // compiles but overflows, is not made a `long`
person Peter Lawrey    schedule 02.01.2013
comment
Ох, не знаех, че final ще направи такава разлика тук. Но така или иначе изглежда странно, тъй като дори във втория пример a и b все още са декларирани като байтове... - person fge; 02.01.2013
comment
освен ако компилаторът не може да определи, че стойността е в диапазон ‹=› това е константен израз, който е в диапазон. - person assylias; 02.01.2013

Резултатът от целочислените операции е int или long. Това е описано в JLS:

4.2.2. Операции с цели числа

Числовите оператори, които водят до стойност от тип int или long:

  • Унарните плюс и минус оператори + и - (§15.15.3, §15.15.4)

  • Мултипликативните оператори *, / и % (§15.17)

  • Адитивните оператори + и - (§15.18)

  • ...

Също така:

5.6.2. Промоция на двоично число

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

Разширяващото примитивно преобразуване (§5.1.2) се прилага за преобразуване на един или двата операнда, както е посочено от следните правила:

  • Ако някой от операндите е от тип double, другият се преобразува в double.

  • В противен случай, ако някой от операндите е от тип float, другият се преобразува в float.

  • В противен случай, ако някой от операндите е от тип long, другият се преобразува в long.

  • В противен случай и двата операнда се преобразуват в тип int.

...

Двоично числово промотиране се извършва върху операндите на определени оператори:

  • Мултипликативните оператори *, / и % (§15.17)

  • Операторите за добавяне и изваждане за числови типове + и - (§15.18.2)

  • Операторите за числено сравнение ‹, ‹=, › и ›= (§15.20.1)

  • Операторите за числово равенство == и != (§15.21.1)

  • Целочислените побитови оператори &, ^ и | (§15.22.1)

  • В определени случаи условният оператор ? : (§15.25)

person NPE    schedule 02.01.2013