正如简短 C#中所解释的(但也适用于其他语言编译器,如 Java)
有一个从 short 到 int、long、float、double 或 decimal 的预定义隐式转换。
您不能将具有较大存储大小的非文字数字类型隐式转换为 short(有关整数类型的存储大小,请参阅整数类型表)。例如,考虑以下两个短变量 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 的一个重要属性,因为这种编程语言被设计用于 Internet 上的分布式应用程序。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 No. 2 (2003)
Blesner-Blech-COCV 2003:Sabine GLESNER , Jan Olaf BLECH,
Fakultät für Informatik,
Universität Karlsruhe
Karlsruhe, Germany]