JAVA中的数据类型转换与原码,反码,补码

Java程序要求数据类型一致性,不一致时会发生转换。自动类型转换将小范围类型提升到大范围,如byte到int。但byte与byte相加会先转换为int,可能导致编译错误,需强制转换回byte。强制转换可能丢失精度或导致高位数据丢失,如double到int。文章还讨论了原码、反码和补码的概念及其在运算中的作用。
摘要由CSDN通过智能技术生成

数据类型转换

什么时候会发生数据类型转换:Java程序要求参与计算的数据必须保持数据类型的一致性,如果不一致就会发生数据类型转换。

自动类型转换

定义:将取值范围小的类型自动提升为取值范围大的类型

public class Main {
    public static void main(String[] args){
       byte b=2;
       int x=b;
        System.out.println(x);
    }
}

运行结果

2

转换原理
byte类型占一个字节,int类型占4个字节,不足的字节高位补0
int x=b;

00000010——>00000000 00000000 00000000 00000010

转换规则
范围小的向范围大的进行转换,
注意: byte,short,char运算时会自动转换为int

下面会出现什么结果

byte b=2;
byte x=b+1;
System.out.println(x);

编译出错
原因: b+1中对byte类进行了运算,则b+1的类型为int,int类型不能直接转换为比它范围小的数据类型。如果非要转换就要使用强制类型转换了

强制类型转换

定义: 将数据范围大的强制转换为数据范围小的
转换格式:

数据类型 变量名=(数据类型)被转数据值

例子

int x=2;
byte b=(byte)x;

练习
下面代码中1和2哪个编译不通过还是全编译不通过

public class Main {
    public static void main(String[] args){
        short s=1;    
        s=s+1;    //1
        s+=1;	  //2
    }
}

答案
第一个编译不通过: s+1中s会自动转换为int,而int类型不能直接转换为short类型,需要对其强制类型转换
第二个编译通过:s+=1相当于s=(s的数据类型)s+1既想当于s=(short)(s+1)

注意:

  • 浮点型转换为整型时,小数点后的数字会直接舍弃,造成精度的缺失
  • 整形转换为short,byte时会造成高位数据的丢失

例子:

public class Main {
    public static void main(String[] args){
        double d=3.14;
        int x=(int)d;
        System.out.println(x);
        System.out.println("==============");
        int y=128;
        byte b=(byte) y;
        System.out.println(b);
    }
}

运行结果

3
==============
-128

第二个为什么等于-128呢?
128的二进制表示形式为 00000000 00000000 00000000 10000000
而转换为byte后变为10000000存储在内存中,而数据的存储是以补码形式存储的,及10000000的真值为-128

原码,反码,补码

原码:值的二进制表示形式
反码:正数的反码等于原码,负数的反码符号位(最高位)不变(0为正,1为负),低位取反(0变1,1变0)
补码:正数的补码等于原码,负数的补码为反码+1;(数据是以补码进行存储的)

为什么不用原码存储数据
因为原码数据做运算时会出错,而补码不会
例如: byte中的 -4+4
原码运算

  10000100
 +00000100
 -----------      
 =10001000(-8不等于0)   

补码运算:
-4存储在内存的二进制表示为->11111100
所以-4+4的运算为:

  11111100
 +00000100
-----------
=100000000(等于0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值