我可以通过在值后面附加一个 L 来创建一个字面量 long;为什么我不能以类似的方式创建文字短或字节?为什么我需要使用带强制转换的 int 文字?
如果答案是“因为 C 中没有短文字”,那么为什么 C 中没有短文字?
这实际上并没有以任何有意义的方式影响我的生活;写(短)0 而不是 0S 之类的东西很容易。但这种不一致让我很好奇;这是当你深夜醒来时困扰你的事情之一。有人在某个时候做出了一个设计决定,使得可以输入某些基本类型的文字,但不能输入所有类型的文字。为什么?
在 C 中,
int
至少意味着具有 CPU 的“自然”字长,而 long
可能意味着“更大的自然”字长(最后一部分不确定,但它也会解释为什么 int
和 long
在 x86 上具有相同的大小)。
现在,我的猜测是:对于
int
和 long
,有一个完全适合机器寄存器的自然表示。然而,在大多数 CPU 上,较小的类型 byte
和 short
在使用之前无论如何都必须填充到 int
。如果是这样的话,你也可以选演员。
我怀疑这是“不要向语言添加任何内容,除非它确实增加了价值”的情况 - 而且它被认为增加的价值太少,不值得。正如你所说,这很容易绕过,而且坦率地说,无论如何都很少有必要(仅用于消除歧义)。
C# 也是如此,我从来没有特别怀念过这两种语言。我在 Java 中怀念的是无符号字节类型:)
另一个原因可能是 JVM 不知道短字节和字节。所有计算和存储都是通过 JVM 内的 int、long、float 和 double 完成的。
有几件事需要考虑。
1)如上所述,JVM 没有字节或短类型的概念。一般来说,这些类型不用于 JVM 级别的计算; 所以人们可以认为这些文字的使用会更少。
2)对于byte和short变量的初始化,如果int表达式是常量并且在类型允许的范围内,它会隐式转换为目标类型。
3)人们总是可以转换文字,例如 (短)10
正如 Jon Skeet 指出的那样,很少需要
byte
和 short
(以及 char
表示为数字)不同的文字类型。 对于确实需要它们的极少数情况,您可以使用类型转换。
有>>两个<< reasons why they are not needed from the perspective of the language:
如之前的答案所述,对字节、短整型和字符值的算术和关系运算被指定为使用 32 位整数算术操作数来执行。 因此,当你写下这个:
byte b = ...
if (b > 1) {
...
}
在与
b
进行比较之前,将 int
的值提升为 1
... 这是一个 int
。
此行为在 JLS 5.6 和 JLS 第 15 章
的相关章节中指定当您将 int
类型的
常量表达式分配给
byte
、short
或 char
类型的变量时,有一条特殊规则(实际上)表明存在隐式类型转换...如果分配的值在变量的范围内。 例如:
byte b = 42; // OK
byte b2 = 1000; // Compilation error - out of range
byte b3 = b + 1; // Compilation error - not a constant expression
这是在JLS 5.2
中指定的据我所知,唯一需要转换
int
文字(除了用于值转换目的)的情况是当您有一个具有(例如)int
和 byte
参数重载的方法时;例如
public void foo(int i) {...}
public void foo(byte b) {...}
foo(42); // binds to first overload
foo((byte) 42); // binds to second overload