Java中关于强制类型转换涉及的二进制问题

        在Java开发过程中,经常会遇到需要强制类型转换的情况。

int a = 754;
byte b = (byte) a;

在这段代码中,int型变量a被强制转换为byte型,由于byte型内存放的数据范围是[-128 - 127],所以在存入 754 这段数字时会丢失部分精度,分析了一番,原理如下:

        1.计算机在存储数字时,会将这些数字以二进制的形式存放

                754的二进制为:10 1111 0010

        2.在754转换为byte型变量时,由于byte型只能存储1字节(8bit)所以会取后8位有效数字

                10 1111 0010    ====》    1111 0010

        3.取‘1111 0010’ 的反码,按位取反,符号位不变

                1000 1101

        4.取‘1000 1101’的补码,补码 = 反码 + 1

                1000 1101 (反码)+ 0000 0001 = 1000 1110 

        5.转换为十进制

                1000 1110 = -14

所以在int强转byte后,精度缺失的情况下得出的结果为 b = -14

        *正数的补码是本身,负数的补码 = 反码 + 1

        *在计算机组成原理中,引入原码、反码、补码的原因为

         1000 = -0 而 0000 = 0 ,-0和0都是相等的,而在内存这种寸土寸金的地方,每一bit的浪费都是犯法!所以引入反码补码机制,使得1000 = 1111 + 1 由此不难猜出,1000就成功的洗白成了 -8 ,而正数的最大值0111只能表示到7。

        在各种数据类型中,经常可以看到负数的个数总是比正数看起来多出1个,底层的原理就是以上。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值