gpt4 book ai didi

java - 为什么编译器没有给出这个加法操作的错误?

转载 作者:IT老高 更新时间:2023-10-28 21:06:13 26 4
gpt4 key购买 nike

我知道编译器会为整数文字进行隐式类型转换。例如:

byte b = 2; // implicit type conversion, same as byte b = (byte)2;

如果范围溢出,编译器会给我一个错误:

byte b = 150; // error, it says cannot convert from int to byte

当变量传递一个表达式时,编译器给出同样的错误:

byte a = 3;
byte b = 5;
byte c = 2 + 7; // compiles fine
byte d = 1 + b; // error, it says cannot convert from int to byte
byte e = a + b; // error, it says cannot convert from int to byte

我得出的结论是,不能保证涉及变量的表达式的结果。结果值可以在字节范围之内或之外,因此编译器会抛出错误。

让我疑惑的是,我这样说编译器并没有报错:

byte a = 127;
byte b = 5;
byte z = (a+=b); // no error, why ?

为什么它没有给我一个错误?

最佳答案

虽然反编译代码可以解释什么Java 在做什么,但为什么它这样做的原因通常可以在语言规范中找到。但在我们开始之前,我们必须建立一些重要的概念:

所以我们回到这个场景:为什么添加两个明显超过一个字节可以处理的字节不会产生编译错误?

它不会因为 overflow 而引发运行时异常.

这是两个数字加在一起突然产生一个非常小的数字的场景。由于byte的范围很小,非常容易溢出;例如,将 1 加到 127 就可以了,结果是 -128。

它的主要原因在于 Java 处理原始值转换的方式;在这种情况下,我们谈论的是 a narrowing conversion .也就是说,即使产生的总和大于byte,收缩转换也会导致信息被丢弃,让数据适合一个byte ,因为这种转换不会导致运行时异常。

逐步分解您的场景:

  • Java 将 a = 127b = 5 加在一起生成 132。
  • Java 理解 ab 的类型是 byte,因此结果也必须是 byte 类型>.
  • 它的整数结果仍然是 132,但此时,Java 将执行强制转换以将结果缩小到一个字节内 - 有效地为您提供 (byte)(a += b) .
  • 现在,由于环绕,az 都包含结果 -124。

关于java - 为什么编译器没有给出这个加法操作的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35546807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com