Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 缩小类型转换:为什么允许将int赋值给声明中的字节?_Java_Type Conversion - Fatal编程技术网

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

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;

对于中级Java程序员来说,这听起来太琐碎了。但在回顾Java基础知识的过程中,我发现了一个问题:

为什么缩小转换像:

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,抱歉,不知道使用什么术语,大脑有点僵硬。