缩小类型转换:为什么允许将int赋值给声明中的字节?

时间:2011-07-08 16:56:39

标签: java type-conversion

对于中级Java程序员来说,这听起来太微不足道了。但在我审查Java基础知识的过程中,发现了一个问题:

为什么缩小转换范围如下:

byte b = 13;

将允许

int i = 13;
byte b = i;

会被编译器抱怨吗?

5 个答案:

答案 0 :(得分:10)

因为byte b = 13 ;是常量的赋值。它的值在编译时是已知的,因此编译器可以/应该/将会抱怨如果常量值的赋值会导致溢出(尝试byte b = 123456789 ;并看看会发生什么。)

将其分配给变量后,您将分配表达式的值,虽然它可能是不变的,但编译器不知道这一点。该表达式可能导致溢出,因此编译器发出呜呜声。

答案 1 :(得分:3)

来自here

  

分配转换时发生   表达式的值已分配   (§15.26)变量:的类型   表达式必须转换为   变量的类型。分配   上下文允许使用身份   转换(第5.1.1节),扩大   原始转换(第5.1.2节)或a   扩大参考转换   (§5.1.4)。 此外,还有一个缩小范围   如果是,则可以使用原始转换   以下所有条件均为   满足:

     
      
  • 表达式是byte,short,char或int类型的常量表达式。
  •   
  • 变量的类型是byte,short或char。
  •   
  • 表达式的值(在编译时已知,因为它是一个常量表达式)可以在变量的类型中表示。
  •   

在您的示例中,满足所有三个条件,因此允许缩小转换。

P.S。我知道我引用的来源是旧的,但是语言的这个方面自那以后没有改变。

答案 2 :(得分:0)

因为文字编号没有类型。

一旦你给它一个类型,它必须被转换为另一个:

int i = 13;
byte b = (byte) i;

答案 3 :(得分:0)

一个字节有8位。一个int,32位,它是一个带符号的数字。

答案 4 :(得分:0)

从具有较小幅度范围的数字(如int到long或long到float)的转换称为加宽。扩大转换的目标是在保持尽可能多的精度的同时不改变数字的大小。例如,将int 2147483647转换为float会生成2.14748365e9或2,147,483,650。差异通常很小,但可能很重要。

相反,有可能丢失有关数字大小信息的转换(如long to int或double to long)称为缩小。通过缩小转换,某些信息可能会丢失,但只要有可能,就会找到最近的表示。例如,将float 3.0e19转换为long会产生-9223372036854775807,这是一个非常不同的数字。