Java基本数据类型数据溢出底层原理:原码、反码、补码

计算器底层使用二机制 补码 进行运算

正数的原码 = 反码= 补码
负数的反码是原码 第一符号位数 不变 其他位数取反
负数的补码是负数的反码+1
一个字节占8位,不足补0,其中第一位表示正负符号,0表示正数,1表示负数
例如 int类型占4个字节,所以有48位二进制,
8是 1000,不足48位补0, 原码为 00000000 00000000 00000000 00001000 是正数 补码=原码 =反码
-8是 原码10000000 00000000 00000000 00001000 是负数
反码 11111111 11111111 11111111 11110111
补码 11111111 11111111 11111111 11111000
计算机以补码进行存储运算
当其强转为byte时 byte占1个字节 所以int类型的前三个字节补码数据丢失
只保留第四个字节数据
此时8 补码为00001000 -8 补码为11111000 第一个字节的第一位表示符号位 8的补码第一位为0 是正数,所以补码=原码,即8的原码也是00001000,再转为十进制 为8
-8 的补码第一位为1 是负数 所以反推 其反码为 111101111 其原码 为 10001000 再转为十进制 为 -8
其运算也是通过补码运算 ,超过位数则丢失数据 ,11000000 加 0100 0000 得九位 1 00000000 此时第九位会丢失 即变为 00000000 所以数据发生错误

强转 如果上例 数字大一点 在第二个字节有数据 ,也会数据发生错误
计算机以补码存储,且有符号位,所以一个字节八位,最大正数为01111111,即1+2+4+8+16+32 +64=127
负数原码即正数原码第一位符号位变为1,即-127原码 为11111111,反码为10000000 补码为10000001,但为什么byte类型范围是-128~127 呢,因为其将-0得补码定义为-128,-0 ( 1000 0000 )(原码) -> (1111 1111)(反码) -> ( [1]0000 0000 )(补码) 我们看出-0的补码最后也是0000 0000 ,
+0和-0的补码相同,由于零只有一种表达方式就行了,-0没什么意义,所以在相同位下补码可以比别的方式多表示一个数。
以至于我们用-0来表示-128,所以-128的补码为1000 0000,没有对应的原码和反码。即在byte类型中将1000 0000 单独表示为-128的补码,不遵从原码补码反码规则,因为只有八位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值