我可以通过将 L 附加到值来创建文字 long;为什么我不能以类似的方式创建文字短或字节?为什么我需要使用带有强制转换的 int 文字?
如果答案是“因为 C 中没有短文字”,那么为什么 C 中没有短文字?
这实际上并没有以任何有意义的方式影响我的生活。写(短)0 而不是 0S 之类的东西很容易。但是这种不一致让我很好奇;当你深夜起床时,这是困扰你的事情之一。有人在某个时候做出了设计决定,以使为某些原始类型输入文字成为可能,但并非对所有原始类型都输入文字。为什么?
在 C 中,int
至少意味着具有 CPU 的“自然”字长,并且long
可能意味着是“更大的自然”字长(在最后一部分中不确定,但它也可以解释为什么int
并且long
具有相同的大小在 x86 上)。
现在,我的猜测是:对于int
和long
,有一个自然的表示完全适合机器的寄存器。然而,在大多数 CPU 上,较小的类型在使用byte
之前short
必须填充到int
反正。如果是这种情况,您也可以进行演员表。
我怀疑这是“除非它真正增加价值,否则不要在语言中添加任何东西”的情况 - 它被视为增加了足够少的价值以至于不值得。正如您所说,很容易绕过,坦率地说,无论如何都很少需要(仅用于消除歧义)。
在 C# 中也是如此,在这两种语言中我从未特别怀念它。我在 Java 中确实想念的是无符号字节类型:)
另一个原因可能是 JVM 不知道短字节和字节。所有计算和存储都是在 JVM 中使用整数、长整数、浮点数和双精度数完成的。
有几件事情需要考虑。
1) 如上所述,JVM 没有字节或短类型的概念。通常这些类型不用于 JVM 级别的计算;所以人们可以认为这些文字的使用会更少。
2) 对于 byte 和 short 变量的初始化,如果 int 表达式是常量并且在类型的允许范围内,则它被隐式转换为目标类型。
3)一个人总是可以转换文字,例如(短)10