Java 缩小类型转换:为什么允许将int赋值给声明中的字节?
对于中级Java程序员来说,这听起来太琐碎了。但在回顾Java基础知识的过程中,我发现了一个问题: 为什么缩小转换像:Java 缩小类型转换:为什么允许将int赋值给声明中的字节?,java,type-conversion,Java,Type Conversion,对于中级Java程序员来说,这听起来太琐碎了。但在回顾Java基础知识的过程中,我发现了一个问题: 为什么缩小转换像: byte b = 13; 将允许 int i = 13; byte b = i; 编译器会抱怨吗?因为文字数字没有类型 一旦你给它一个类型,它必须铸造到另一个: int i = 13; byte b = (byte) i; 因为字节b=13是常数的赋值。它的值在编译时是已知的,因此如果常量值的赋值会导致溢出,编译器可以/应该/将发出呜呜声(试试字节b=123456789;
byte b = 13;
将允许
int i = 13;
byte b = i;
编译器会抱怨吗?因为文字数字没有类型 一旦你给它一个类型,它必须铸造到另一个:
int i = 13;
byte b = (byte) i;
因为
字节b=13代码>是常数的赋值。它的值在编译时是已知的,因此如果常量值的赋值会导致溢出,编译器可以/应该/将发出呜呜声(试试字节b=123456789;
,看看会发生什么。)
一旦你把它赋给一个变量,你就是在赋一个表达式的值,虽然它很可能是不变的,但编译器并不知道这一点。该表达式可能会导致溢出,因此编译器会发出呜呜声。一个字节有8位。一个整数,32位,是一个有符号的数字 来自:
分配转换发生在
表达式的值被赋值
(§15.26)到变量:变量的类型
表达式必须转换为
变量的类型。分配
上下文允许使用标识
转换(§5.1.1),加宽
原始转换(§5.1.2),或
加宽参考转换
(§5.1.4). 此外,缩小了
如果需要,可以使用原语转换
以下所有条件均适用
满意:
- 表达式是byte、short、char或int类型的常量表达式
- 变量的类型为byte、short或char
- 表达式的值(在编译时已知,因为它是一个常量表达式)可以用变量的类型表示
在您的示例中,这三个条件都满足,因此允许进行缩小转换
另外,我知道我引用的源代码很旧,但语言的这一方面从那以后就没有改变过。从一个较小幅度的数字(如int到long或long到float)的转换称为加宽。加宽转换的目标是在保持尽可能多的精度的同时,不改变数字的大小。例如,将int 2147483647转换为浮点产生2.14748365e9或2147483650。差别通常很小,但可能很大
相反,如果有可能丢失有关数字大小的信息(如长到int或双到长),则转换称为缩小。通过缩小转换范围,可能会丢失一些信息,但尽可能找到最接近的表示形式。例如,将浮动利率3.0e19转换为长期收益率——9223372036854775807,这是一个非常不同的数字。@Robert,抱歉,不知道使用什么术语,大脑有点僵硬。