首先要知道JAVA一些默认的类型
Java 整型常量的默认类型是 int类型
Java 浮点型常量的默认类型是 double类型
如果定义一个 byte的类型
即 byte a = 10;
因为10是常量 所以默认是int类型的
在底层以二进制的形式是这样的 0000-0000 0000-0000 0000-0000 0000-1010
然后接着就会判断 这个数(10)是不是在byte类型这个范围内 如果是
就会把前面3个字节砍掉也就是说会变成这样 0000-1010
然后赋值给变量 a
为什么byte类型的变量不能相加
假设我们定义 3个 byte类型的变量
即 byte a, b, c;
然后 假设b和c分别赋值10和20吧
即 b = 10; c = 20;
接着来相加赋值 即 a = b + c;
这样如果程序运行的话会报错,说损失精度.
原因:
因为b和c都是byte类型的变量
如果b或者c这个变量被用户修改了,假设b被修改成127
那么 a = b + c就会等于 a =127 + 20;
这样a = 147 了
又因为a是byte类型的 底层判断这个147是不是在byte这个范围内
发现超出了,就会提示报错
简单来说就是多个byte类型相加之后超过byte类型的范围,然后默认int类型,砍掉前面3个字节就会损失精度,所以JAVA为了安全起见会报错提醒
如果非要相加 可以进行 强制类型转换
int类型的变量为什么又可以进行相加
Java 整型常量的默认类型是 int类型
所以当我们定义3个int类型变量的时候
即 int x,y,z;
然后赋值 y和z;
即 y = 10; z = 20;
底层就相当于把 0000-0000 0000-0000 0000-0000 0000-1010
给到 int 类型的 y.
把0000-0000 0000-0000 0000-0000 0001-0100
给到 int 类型的z.
如果 x = y + z;
底层就相当于 把 y 和 z的二进制数相加
如果 y 或者 z 相加超过 int类型的 就只会保留前面4个字节的二进制码,其它的区别舍弃
这也就是为什么如果 int 类型 相加 如果超出范围就会变成负数的原因
即 最前面的0变成了1 因为我们字节最前面默认是0,如果是1,那这个数就是负数.
代码:
public class day02_05 //类名
{
public static void main(String[] args)
{
byte a = 10;
/*
整数常量默认int类型 然后因为byte的范围是 -128 到 127
底层会判断赋值的数 是不是在 byte这个范围内
如果在 就会把 前面3个字节砍掉 再 赋值给变量
*/
a = 7+5; //这个也是同理 把 7+5 相加等于10 然后判断 如果在byte这个范围内 就把前面3个字节砍掉再赋值
System.out.println(a); //输出a
byte b=10, c=1;
// a = b + c; //显示错误,会损失精度
/*
原因: 因为b和c都是byte变量
如果 b被用户变成 = 127 或者c的值被改大了
那么 a = b+c 就变成 a = 127 + 1
a是byte类型 然后 底层判断 要赋值的数 超过byte类型的范围
如果砍掉前面三个字节就会损失精度
*/
int x, y = 10, z = 20;
x = y + z; //这个能正常编译
/*
原因: 因为默认是int类型
如果 y 或者 z的值被改超出 int类型的范围
那么 赋值给x的值的就只会保留int前面四个字节的二进制数,其余的都舍弃
*/
}
}
至于那个 int 类型相加超出 int 范围,会变成负数可以字节测试一下.