根据Java中的类型转换规则之一:

如果表达式仅包含整数文字和/或变量,最高可达类型int(含),则表达式的结果将为 int。换句话说,即使表达式没有 int 类型的变量,表达式的结果也将是 int。

如果byte/short数据类型被类型转换为int.使用它们有什么意义?

我尝试用谷歌搜索这个问题。但由于我的英语不好,我找不到答案。

8

  • 5
    原因之一是原始数组。例如,a的每个元素byte[]占用8位RAM。


    – 

  • 你从哪里得到这个报价?不是我怀疑的 JLS。事实上,事情比这更复杂。


    – 


  • 3
    1. 仅当您执行相关操作时,它才会被转换为 int 2. 即使它们被转换为 int,这只是中间内存的问题,您可能仍然希望最终内存/磁盘存储中的字节大小更小。


    – 


  • @StephenC 这句话来自于java课程


    – 

  • @AS – 啊是的。为了教学目的,它被简化以提出一个特定的观点。就像他们教导高中生没有什么可以比光速更快一样。 (反例: /…)如果您想批评 Java 语言设计,您需要一个更可靠的技术信息源……其中不包含此类(过度)简化。


    – 



4 个回答
4

你是对的,Java 中的字节在执行算术或按位运算符时效率不高,但字节数据类型可以以多种方式具体使用

  • 通过 IO 进行数据传输期间,无论是网络还是文件或任何其他 IO 操作
  • 不常用于字符串,但它也可用于创建 UTF-16 字符串(

1

  • 1
    实际上,在现代计算机(以及 Java 设计时的典型计算机)上,byte和的硬件指令不存在,或者并不比它们的 32 位等效指令更快shortchar早在 20 世纪 90 年代中期,带有 32 位 ALU 的处理器芯片就很常见。因此,对于编译型 Java 的目标市场来说,“效率”点是不正确的。 (也适用于解释型 Java……出于其他原因。)


    – 


让我们从您提供的(无来源)报价开始:

如果表达式仅包含整数文字和/或变量,最高可达 int 类型(含),则表达式的结果将为int。换句话说,即使表达式没有 类型的变量int,表达式的结果也将是int

这并不严格正确。例如:

char x = str.charAt(1);
char[] chars = str.toCharArray()
char y = chars[1];

chars[1]表达式和的类型str.charAt(1)都是char。并且…可以分配给char变量而无需显式类型转换。这里没有促销发生。

然而,所引用的句子对于大多数一元和二元运算符都是正确的。例如

byte b1, b2 = ...
byte b3 = (byte) (b1 + b2);

子表达式b1 + b2的类型为int。 (IIRC,来自b1和 的b2被提升,然后int执行加法,产生一个int。)因此,如果要将结果分配给变量,则需要显式类型转换byte

简而言之,这句话过于简单化了。 (或者你已经断章取义了。)

不管怎样,不要认为随机的 Java 课程、教程或教科书所说的内容是 100% 准确的。最可靠的来源是 Java 语言规范 (JLS)。

如果您查阅有关此主题的 JLS,您将发现 Java 表达式和赋值的键入有许多“问题”。例如,它会告诉您为什么这是合法的:

byte b = 1 + 2;    // OK

但这不是:

byte b1 = 1;
byte b2 = b1 + 2;  // ERROR

所以现在…对于你的问题…

如果 byte/short 数据类型被类型转换为 int。使用它们有什么意义?

前提是不正确的,如上所述。但假设它是正确的,有很多“点”。

正如我在评论中指出的,原始类型数组以紧凑形式存储,无论原始类型本身如何存储。 IIRC,JLS 中有说明。从时间和空间的角度来看,将字节数组表示为 32 位整数数组的效率非常低。

因此,如果存在可以表示元素值的不同类型,则涉及此类数组及其元素的许多操作都更容易编写代码;即byte对于字节数组,char对于字符数组。 (有人可能会说byte应该不签名,char应该更大,但这是另一个问题。)

事实上,正如byte那样,havingcharshorttypes 还可以向其他阅读代码的程序员传达某些整数变量的值被限制在特定范围内的信息。它使代码更容易阅读并且更容易(非正式地)推理。

但是鉴于 Java 有bytecharshort,您需要使用它们吗?

对于某些类型的程序:不需要。但是,如果您的程序必须在任何时候操作文件或文本数据,您可能无法避免使用charand/or byte。 (而且没有实际理由这样做!)


最后,还有历史的视角。 Java 的设计目的是让 C 和 C++ 程序员能够轻松过渡到 Java。 C 和 C++ 具有多种整数类型,包括 8 位和 16 位类型,但它们在表达式的类型和语义以及表达式求值方面也存在“问题”。 (对于 C++ 来说它很复杂,对于 C 来说它没有明确说明!)

Java 需要(至少)提供bytechar并且short要让 C 和 C++ 程序员满意,但他们也希望避免因原始运算符过多“重载”而带来的复杂性和实现开销。我们今天在 Java 中看到的表达式语义就是这些妥协的结果。

1

  • 感谢您的全面回答。下次我会记住您对信息来源的所有建议。实际上,上下文是关于运算符对原始数据类型执行结果的影响。


    – 

归根结底,您可能是对的,但这种实施“细节”背后有一些很好的理由:

  • 正如 @Stephen C 所指出的,每种类型分配的字节量各不相同(至少在它们被强制/提升为“更大”类型之前);
  • 使用byteshort显式传达该变量只能保存特定范围内的值(即分别为 -128 到 127 和 -32768 到 32767)。

在 Java 中,较小的整数类型(如byteshortchar)很有价值,因为它们可以节省内存、定义特定的数据范围、增强类型安全性并确保与其他系统的兼容性。虽然在某些情况下它们可能会被提升为 int,但它们的存在除了它们的大小之外还有更广泛的用途。