2015-05-11 2 views
1

Может кто-нибудь объяснить мне, почему я не могу умножить два байта таким образом?Умножение двух байтов

byte a = 1; 
byte b = 1; 
byte c = a*b; 

или

byte a = 1; 
byte b = 1; 
short c = a*b; 

Почему я должен сделать это таким образом?

byte a = 1; 
byte b = 1; 
byte c = (byte)(a*b); 

или

byte a = 1; 
byte b = 1; 
int/double/float/long c = a*b; 
+1

считают, что '255 * 255 = 65535', который слишком велик, чтобы поместиться в байт ... –

+1

@MarcB' 255' слишком велик, чтобы поместиться в 'byte' (он подписан на Java) и' 255 * 255' '65025'. – rgettman

+0

Это несоответствие языка. Нельзя гарантировать, что произведение двух 'int' не будет помещено в' int', но 'int = int * int' разрешено без кастования. – khelwood

ответ

2

Продукт из двух байт не обязательно вписываться в байт. Поэтому Java требует, чтобы вы сказали, что знаете, что делаете, и подтвердите, что в случае переполнения вы получите младшие биты.

+0

Спасибо :) Я понимаю это сейчас! – Mateusz

+1

Это не причина. По этому рассуждению умножение 2 'int' заставит вас назначить 'long' или передать' int'. – rgettman

+0

Удачи Mateusz! Пожалуйста, отметьте ответ как принято. – amahfouz

5

При выполнении математики с byte с, бинарного числового расширения происходит, как указано в JLS, Section 5.6.2.

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

  1. Если любой операнд имеет ссылочный тип, он подвергается распаковке преобразования (п. 5.1.8).

  2. Widening примитивного преобразования (§5.1.2) применяются для преобразования любого или оба операнда, как указано по следующим правилам:

    • Если один из операндов имеют типа двойные, а другой преобразуются в два раз ,

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

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

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

(курсив мой)

Это заставляет вас назначить тип, который, по крайней мере так велик, как int или бросить обратно в byte.

Смежные вопросы