数据类型转换

整型,字符型,浮点型的数据再混合运算中相互转换,转换时遵循以下原则:
 1.容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为:

       byte,short,char->int->long->float->double

                 byte,short,char之间不会相互转换,他们三者再计算时首先会转换为int类型

2.容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能

    造成精度降低或者溢出;使用时要格外注意-----------数据类型的强转

3.有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的

   那一种数据类型,然后在进行计算     ------------------数据类型的提升

public class Demo4{

       public static void main(String[] args){

      byte b = 10;

      b = b + 20;//这是错误的

     b = (byte)(b+20);//这是正确的,(byte)作为强制转换转换b+20,b+20里面先做了一个数据类型的提升变为了int。

      可能会损失精度。因为混合计算要先转换成数据类型容量最大的哪个,20默认为int类型,所以会把b先转换成为byte,计算的结果的数据类型就是int,但是因为接收数据的b是byte类型,容量大的数据类型向容量小的数据类型转换需要进行强制转换。但可能会造成精度降低或者溢出。

    //byte c = 500;这是错误的

     这里 500超过了本身byte的取值范围。

     500默认是int类型也就是4字节,但是byte是1字节。

     直接把4字节放入1字节空间是不可能的。

     byte c1 = (byte)(500);//byte取值范围是-128--127

    表示将4字节的500强制转换成1字节空间,但是此处存在精度降低;
     byte b3 = (byte)500;//-12

     111110100

     因为在代码中数字是以二进制的补码来表示的。

      所以500的二进制是: 111110100

      因为进行了强制转换所以剩下了8位:11110100补码负数的补码是反码+1所以这里减去一个一,变成了下面的反码

                                                                  11110011

                                                                  10001100负数的反码是源码的除去符号位的相反,除了第一位以外全部取反

     结果是:-12这是他溢出以后的结果

   69 + 87  =  -100//为什么?

在java中,int 占用2字节,byte 占用1字节。
69用int的二进制表示为:00000000 01000101 ,87表示为:00000000 01010111,二者相加得:00000000 10011100,强转为byte,舍去高8位 ,得到 :10011100 ,如果是无符号数就是十进制:156,如果是有符号数就是 -100的补码表示形式。

      }

}

  //数据类型的自动提升(整型提升成浮点型,就是给其之后带一位小数,且值是0)
       double d = 100;
       System.out.println(d);//100.0
       
       //数据类型的强制转换(浮点型强转成整型,直接干掉小数部分)
       int a = (int)314.5;
       System.out.println(a);//314

       System.out.println("========================");

       byte b4 = 10;
       byte b5 = 20;
       /*
        b4 + b5 --->在运算过程中b4和b5都会自动提升成为4字节的10和20,
        所以计算的结果是4字节的30;
        byte b6 = b4 + b5; 再将计算得来的4字节的30赋值给1字节的b6,肯定
        不可能;
        所以也需要强转 byte b6 = (byte)(b4 + b5);
       */

         char c = 'a';
       System.out.println(c+1);//98  'a'--->97  自动提升
       System.out.println((int)c);//强制提升

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值