【问题标题】:Why are there no byte or short literals in Java?为什么 Java 中没有字节或短文字?
【发布时间】:2010-09-23 23:41:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: java primitive


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,请添加无符号字节:(。对于手头的问题,我认为值得一提的是有一个长迭代,因为 int 文字不能代表 long 的所有值。但是 int 可以另一方面,表示 short 的所有值。
      • 但我认为它确实增加了价值——不必投射可能是一个很大的优势。 short val = (short)(val + 10) 很烦人,尽管 Java 还必须允许添加 shorts 才能工作。
      • @mjaggard:这是一个添加足够少的价值 使其不值得的问题。这有点令人讨厌,但远不是最大的问题......
      【解决方案3】:

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

      【讨论】:

      • 好的,但是每个 JVM 都是这样吗?即使是这样,语言定义真的应该依赖于它运行的虚拟机的实现细节吗?不应该反过来吗?
      • 它是 JVM 规范的一部分,所以是的:JVM 无法知道它处理的值的真正类型是什么。 (除了一些操作,如数组访问,存在单独的操作码)。
      • 存储不是总是用整数等完成。明显的例子是一个字节数组,它肯定被存储为一个字节数组而不是整数。另见stackoverflow.com/questions/229886/…
      • 对,数组是一种特殊情况,确实具有每种类型的指令(可能是因为每个条目使用 4 个字节的 byte[] 有点太浪费了)
      • “JVM 不知道 short 和 byte。”:这是否意味着当我将成员变量声明为 byte 或 short 类型时,它实际上占用了 int 一样多?
      【解决方案4】:

      有几件事情需要考虑。

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

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

      3) 总是可以转换字面量,例如 (short)10

      【讨论】:

        猜你喜欢
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 2010-10-18
        • 1970-01-01
        • 2013-07-15
        • 2016-10-12
        相关资源
        最近更新 更多