Java 为什么字节可以';t保持在其范围内的值?

Java 为什么字节可以';t保持在其范围内的值?,java,int,byte,primitive-types,Java,Int,Byte,Primitive Types,你不能把大的价值放在小杯子里。好吧,你可以,但你会失去一些。正如我们所说,你会得到溢出。如果编译器可以从您的代码中看出某些内容不适合您正在使用的容器(变量),那么它会尝试帮助防止这种情况 比如说, int x= 24; byte b= x; // Won't work!! 现在字节的范围是-128到127。现在,我的问题是为什么这不起作用?毕竟,x的值是24,而且24绝对小到可以放入字节(这可能是一个非常初级的问题,但我对这个概念非常困惑)。您需要以这种方式将int键入字节: byte b

你不能把大的价值放在小杯子里。好吧,你可以,但你会失去一些。正如我们所说,你会得到溢出。如果编译器可以从您的代码中看出某些内容不适合您正在使用的容器(变量),那么它会尝试帮助防止这种情况

比如说,

int x= 24;

byte b= x;

// Won't work!!

现在字节的范围是
-128
127
。现在,我的问题是为什么这不起作用?毕竟,
x
的值是
24
,而且
24
绝对小到可以放入字节(这可能是一个非常初级的问题,但我对这个概念非常困惑)。

您需要以这种方式将int键入字节:

byte b = (byte) x;
否则编译器将在编译时给您一个错误
请记住,如果值超出存储在其中的基本数据类型的边界,则类型转换会导致数据丢失。

您知道
字节b=x
相当于
字节b=24,而智能编译器也可以看出这一点,但Java是以非常精确的方式指定的,以确保所有编译器都执行相同的操作,并且它不允许编译器在接受或拒绝程序时注意到这种等价性。(不过,他们可以在以后使用它来执行优化。)编译器应该知道的是表达式
x
具有静态类型
int
,因此它不能保证
byte b=x
byte
范围内赋值

相反,您必须编写
byte b=(byte)x
,显式地将表达式
x
转换为类型
byte

(这是静态键入的一般原则-对于任何类型系统,总会有一些正确的程序被类型系统拒绝。在这种情况下,类型系统不允许您在没有强制转换的情况下从
int
分配到
byte

可能很有用。)