为什么Java中没有字节或短文字?

问题描述 投票:0回答:5

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

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

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

java primitive
5个回答
15
投票

在 C 中,

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

现在,我的猜测是:对于

int
long
,有一个完全适合机器寄存器的自然表示。然而,在大多数 CPU 上,较小的类型
byte
short
在使用之前无论如何都必须填充到
int
。如果是这样的话,你也可以选演员。


8
投票

我怀疑这是“不要向语言添加任何内容,除非它确实增加了价值”的情况 - 而且它被认为增加的价值太少,不值得。正如你所说,这很容易绕过,而且坦率地说,无论如何都很少有必要(仅用于消除歧义)。

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


4
投票

另一个原因可能是 JVM 不知道短字节和字节。所有计算和存储都是通过 JVM 内的 int、long、float 和 double 完成的。


2
投票

有几件事需要考虑。

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

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

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


0
投票

正如 Jon Skeet 指出的那样,很少需要

byte
short
(以及
char
表示为数字)不同的文字类型。 对于确实需要它们的极少数情况,您可以使用类型转换。

有>>两个<< reasons why they are not needed from the perspective of the language:

  1. 如之前的答案所述,对字节、短整型和字符值的算术和关系运算被指定为使用 32 位整数算术操作数来执行。 因此,当你写下这个:

    byte b = ...
    if (b > 1) {
        ...
    }
    

    在与

    b
    进行比较之前,将
    int
    的值提升为
    1
    ... 这是一个
    int

    此行为在 JLS 5.6JLS 第 15 章

    的相关章节中指定
  2. 当您将 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
© www.soinside.com 2019 - 2024. All rights reserved.