Як пояснюється коротко C # (але також для інших мовних компіляторів, таких як Java)
Існує заздалегідь визначене неявне перетворення з короткого на int, long, float, double або decimal.
Ви не можете неявно перетворити нелітеральні числові типи великого обсягу сховища в короткі (див. Таблицю інтегральних типів для розмірів сховищ цілісних типів). Розглянемо, наприклад, наступні дві короткі змінні x та y:
short x = 5, y = 12;
Наступний оператор присвоєння видасть помилку компіляції, оскільки арифметичний вираз праворуч від оператора присвоєння за замовчуванням має значення int.
short z = x + y;
Щоб вирішити цю проблему, використовуйте привід:
short z = (short)(x + y);
Можна, однак, використовувати наступні твердження, коли цільова змінна має однаковий або більший розмір сховища:
int m = x + y;
long n = x + y;
Хорошим подальшим запитанням є:
"чому арифметичний вираз у правій частині оператора присвоєння за замовчуванням оцінює як int"?
Першу відповідь можна знайти в:
Класифікація та формальна перевірка цілого цілого постійного згортання
Специфікація мови Java визначає, як саме представляються цілі числа та як обчислюються цілочисельні арифметичні вирази . Це важлива властивість Java, оскільки ця мова програмування розроблена для використання в розподілених додатках в Інтернеті. Програма Java потрібна для отримання того самого результату незалежно від цільової машини, яка його виконує .
На відміну від цього, C (і більшість широко використовуваних імперативних та об'єктно-орієнтованих мов програмування) є більш недбалим і залишає відкритими багато важливих характеристик. Намір цієї неточної мовної специфікації зрозумілий. Ті самі програми C повинні працювати на 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: Сабіне ГЛЕСНЕР , Ян Олаф БЛЕХ,
Факультет інформатики,
Університет Карлсруе,
Карлсруе, Німеччина]
T a, b; a += b
еквівалентноT a, b; a = (T) (a + b)
: зверніть увагу на доданий компілятором склад.