【问题标题】:Why Byte can't hold a value that is within its range?为什么字节不能保存在其范围内的值?
【发布时间】:2023-03-28 14:25:01
【问题描述】:
你不能把大的价值放在小杯子里。好吧,好吧,你可以,但你会失去一些。正如我们所说,你会得到溢出。如果编译器可以从您的代码中看出某些内容不适合您正在使用的容器(变量),则编译器会尝试帮助防止这种情况发生。
例如,
int x= 24;
byte b= x;
// Won't work!!
现在字节的范围是-128 到127。现在,我的问题是为什么这不起作用?毕竟x的值是24,而24绝对小到可以放入字节(可能是一个非常新手级别的问题,但我对这个概念真的很困惑)。
【问题讨论】:
标签:
java
int
byte
primitive-types
【解决方案1】:
你知道byte b= x; 等价于byte b= 24;,智能编译器也能分辨出来,但Java 以非常精确的方式指定,以确保所有编译器都执行相同的操作,并且它不允许编译器为了接受或拒绝程序而注意到这种等价性。 (不过,他们可以在之后使用它来执行优化。)所有编译器都应该知道表达式x 具有静态类型int,因此它不能保证byte b= x 正在分配一个值byte的范围。
相反,您必须编写 byte b = (byte) x,将表达式 x 显式转换(“转换”)为类型 byte。
(这是静态类型的一般原则——对于任何类型系统,总会有一些其他正确的程序被类型系统拒绝。在这种情况下,类型系统不允许您从int 分配到byte 没有演员表。)
【解决方案2】:
您需要以这种方式将您的 int 类型化为一个字节:
byte b = (byte) x;
否则编译器会在编译时给你一个错误
请记住,如果值超出了您存储的原始数据类型的边界,则类型转换会丢失数据。