为什么Java中没有字节或短整型字面量?

54
我可以通过将L附加到值来创建一个字面意义的长整型;为什么不能以类似的方式创建短整型或字节的字面量? 为什么需要使用带有转换的int字面量?
如果答案是“因为C中没有short字面量”,那么为什么C中没有short字面量呢?
这实际上并不会对我的生活产生任何有意义的影响;写(short)0而不是0S或其他东西很容易。 但是这种不一致性让我很好奇;这是你在深夜时感到困扰的事情之一。 某个时候,某个人做出了一个设计决定,使得可以为一些原始类型输入字面量,但不能为所有原始类型输入字面量。 为什么?
4个回答

15
在C语言中,int至少应该具有与CPU相同的“自然”字长,而long可能意味着更大的“自然”字长(最后一部分不确定,但这也可以解释为什么在x86上intlong具有相同的大小)。
现在,我的猜测是:对于intlong,存在一种自然表示法,可完全适合于机器的寄存器。但是,在大多数CPU上,较小的类型byteshort在使用前必须先填充到一个int。如果是这种情况,那么你同样可以进行转换。

8

我认为这是“不要为语言添加任何东西,除非它确实增加了价值”的情况 - 并且被视为增加的价值太小而不值得。正如你所说,很容易绕过,并且坦率地说,这通常也不是必需的(仅用于消除歧义)。

C#中也是如此,我从未在任何一种语言中特别想念它。我在Java中想念的是无符号字节类型:)


4
是的,请添加未签名字节:(。至于问题,我认为值得一提的是有一个长整型字面量,因为int字面量不能表示所有long的值。但是另一方面,int可以表示所有short的值。 - Johannes Schaub - litb
但我认为它确实增加了价值——不需要强制转换可能是一个巨大的优势。short val = (short)(val + 10) 只是很烦人,尽管 Java 也必须允许 short 的加法才能起作用。 - mjaggard
@mjaggard:这只是添加了足够少的价值,使其不值得。这有点令人烦恼,但远非最大的问题… - Jon Skeet

4

另一个原因可能是JVM不知道short和byte。在JVM内部,所有的计算和存储都是使用int、long、float和double进行的。


1
好的,但这对每个JVM都适用吗?即使是这样,语言定义是否真的应该依赖于它运行的VM的实现细节?难道不应该反过来吗? - Will Wagner
5
存储并不总是使用整数等数据类型。一个显而易见的例子是字节数组,它被存储为字节数组而非整数数组。参见 https://dev59.com/rHVC5IYBdhLWcg3woStW - Jon Skeet
2
JVM 不知道 short 和 byte。这是否意味着,当我声明一个成员变量为 byte 或 short 类型时,它实际上占用了与 int 相同的空间? - Giorgio
如果JVM不知道字节,为什么(int)(byte)100000001 == 1 - kamczak
@kamczak:因为编译器(或者如果你愿意,可以说是"Java语言")被设计成产生可以生成该输出的字节码。 - Joachim Sauer
显示剩余6条评论

2

需要考虑以下几点:

1)如上所述,JVM没有byte或short类型的概念。通常在JVM级别计算时不使用这些类型;因此可以认为这些字面量的使用会更少。

2)对于byte和short变量的初始化,如果int表达式是常量且在允许的类型范围内,则会隐式转换为目标类型。

3)您始终可以将字面量强制转换,例如(short)10


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接