Как объяснено в short C # (но также и для других языковых компиляторов, таких как Java)
Существует предопределенное неявное преобразование из short в int, long, float, double или decimal.
Вы не можете неявно преобразовать нелитеральные числовые типы с большим размером хранилища в короткое (см. Таблицу интегральных типов для размеров хранилища целых типов). Рассмотрим, например, следующие две короткие переменные x и y:
short x = 5, y = 12;
Следующий оператор присваивания приведет к ошибке компиляции, , поскольку арифметическое выражение в правой части оператора присваивания по умолчанию оценивается как int.
short z = x + y; // Error: no conversion from int to short
Чтобы исправить эту проблему, используйте приведение:
short z = (short)(x + y); // OK: explicit conversion
Можно, однако, использовать следующие операторы, где переменная назначения имеет такой же или более большой размер хранилища:
int m = x + y;
long n = x + y;
Хороший дополнительный вопрос:
"почему арифметическое выражение в правой части оператора присваивания по умолчанию равно int"?
Первый ответ можно найти в:
Классификация и формальная проверка складывания целочисленных констант
Спецификация языка Java точно определяет, как должны представляться целые числа и как должны оцениваться целочисленные арифметические выражения . Это важное свойство Java, так как этот язык программирования был разработан для использования в распределенных приложениях в Интернете. Требуется, чтобы программа на Java выдавала один и тот же результат независимо от того, на каком компьютере его выполняла .
Напротив, С (и большинство широко используемых императивов и
объектно-ориентированные языки программирования) более небрежны и оставляют открытыми многие важные характеристики. Намерение за этим неточным языком
спецификация понятна. Одни и те же программы на Си должны работать на 16-битной,
32-битная или даже 64-битная архитектура путем создания целочисленной арифметики
исходные программы с арифметическими операциями, встроенными в целевой процессор. Это приводит к гораздо более эффективному коду, потому что он может использовать доступный
машинные операции напрямую. Пока целочисленные вычисления имеют дело только
если числа «достаточно малы», несоответствия не возникнут.
В этом смысле целочисленная арифметика C является заполнителем, который не определен точно
спецификацией языка программирования, но только полностью определяется путем определения целевой машины.
Java точно определяет, как представлены целые числа и как должна вычисляться целочисленная арифметика.
Java Integers
--------------------------
Signed | Unsigned
--------------------------
long (64-bit) |
int (32-bit) |
short (16-bit) | char (16-bit)
byte (8-bit) |
Char - единственный целочисленный тип без знака. Его значения представляют символы Unicode, от \u0000
до \uffff
, то есть от 0 до 2 16 -1.
Если у целочисленного оператора есть операнд типа long, то другой операнд также преобразуется в тип long. В противном случае операция выполняется над операндами типа int, при необходимости более короткие операнды преобразуются в int . Правила конвертации точно указаны.
[Из электронных заметок по теоретической информатике 82 № 2 (2003)
Blesner-Blech-COCV 2003: Сабина ГЛЕСНЕР , Ян Олаф БЛЕХ,
Fakultät für Informatik,
Университет Карлсруэ
Карлсруэ, Германия]