JAVA,byte类型的变量为什么不能相加,以及int类型的变量为什么可以相加

首先要知道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 范围,会变成负数可以字节测试一下.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值