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

  • Post author:
  • Post category:java





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



版权声明:本文为weixin_42947972原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。