2015-10-03 1 views
3
short x, y; 
short z = ((short)x) + ((short)y); 

Так что я понимаю, что в Java, что значение считается целым числом, когда он добавляется. Это всего лишь один из нюансов на этом языке. Тем не менее, здесь, я уже литье short к переменным x и y и она по-прежнему дает мне ошибку о том, чтоКастинг значения и в результате математику

не может преобразовать из ИНТ короткого

+0

Как вы сказали, '+' дает 'int'. – aioobe

+0

thats поощрение типа в java.http: //www.java2s.com/Book/Java/0020__Language-Basics/The_Type_Promotion_Rules.htm – cafebabe1991

ответ

6

поэтому я понимаю, что в java, что значение считается целочисленным, когда оно добавлено.

Не обязательно. Например, если вы добавляете long s.

Однако здесь я уже склоняюсь к переменным x и y, и это все еще дает мне сообщение об ошибке, которое не может преобразовать из int в short.

Это потому, что вы добавляете значения до их добавления; + по-прежнему int. (На самом деле, (short)x является не-оп; x является ужеshort.)

Правильный способ написать что:

short z = (short)(x + y); 

The short с получить звание int с, суммируются , а затем мы возвращаем результат до short.

Re ваш комментарий:

(я) не уверен, почему первый кастинг х и у в короткий и положить их в скобки не приведет к коротким + короткое дополнение

Потому что Java не имеетshort + short дополнение. Маленький размер это делает добавление на это int, потому что the first thing в «добавка» операторы (+ и -) делают это binary numeric promotion:

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

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

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

    • В противном случае, если один из операндов имеет тип float , the other is converted to float`.

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

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

Так short + short (или char + char или byte + byte) становится int + int с получением int. Только целочисленные дополнения Java имеет int + int => int и long + long => long.

+0

Я понимаю, что вы говорите, но я по-прежнему логически не уверен, почему сначала кастинг x и y, чтобы коротко и положить их в круглые скобки, не приведет к короткому + короткому добавлению. Выполняется ли кастинг отдельно для x и y, затем java AGAIN преобразует их обратно в int? – Borla312

+0

@ Borla312: * «Не знаю, почему первое приведение x и y к коротким и помещение их в круглые скобки не привело бы к короткому + короткому добавлению» * Поскольку Java * не имеет * короткого + короткого добавления. Я расширил ответ, чтобы уточнить это. –

+0

Благодарим вас за очень подробное и подробное объяснение TJ! – Borla312

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