54

我可以通过将 L 附加到值来创建文字 long;为什么我不能以类似的方式创建文字短或字节?为什么我需要使用带有强制转换的 int 文字?

如果答案是“因为 C 中没有短文字”,那么为什么 C 中没有短文字?

这实际上并没有以任何有意义的方式影响我的生活。写(短)0 而不是 0S 之类的东西很容易。但是这种不一致让我很好奇;当你深夜起床时,这是困扰你的事情之一。有人在某个时候做出了设计决定,以使为某些原始类型输入文字成为可能,但并非对所有原始类型都输入文字。为什么?

4

4 回答 4

15

在 C 中,int至少意味着具有 CPU 的“自然”字长,并且long可能意味着是“更大的自然”字长(在最后一部分中不确定,但它也可以解释为什么int并且long具有相同的大小在 x86 上)。

现在,我的猜测是:对于intlong,有一个自然的表示完全适合机器的寄存器。然而,在大多数 CPU 上,较小的类型在使用byte之前short必须填充到int反正。如果是这种情况,您也可以进行演员表。

于 2008-11-25T16:09:44.620 回答
8

我怀疑这是“除非它真正增加价值,否则不要在语言中添加任何东西”的情况 - 它被视为增加了足够少的价值以至于不值得。正如您所说,很容易绕过,坦率地说,无论如何都很少需要(仅用于消除歧义)。

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

于 2008-11-25T16:02:26.087 回答
4

另一个原因可能是 JVM 不知道短字节和字节。所有计算和存储都是在 JVM 中使用整数、长整数、浮点数和双精度数完成的。

于 2008-11-25T16:04:12.680 回答
2

有几件事情需要考虑。

1) 如上所述,JVM 没有字节或短类型的概念。通常这些类型不用于 JVM 级别的计算;所以人们可以认为这些文字的使用会更少。

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

3)一个人总是可以转换文字,例如(短)10

于 2013-02-26T20:23:34.680 回答