为什么Java中byte类型128输出-128

Java中byte的取值范围是-128~127

那么给byte类型输入128会怎么样?

public class Test {
    public static void main(String[] args) {
        int a = (byte)128;
        System.out.println(a);
    }
}

//-128

结果是-128

为什么?

计算机在存储的时候都是以二进制存储的,那么正数就不用说了,负数怎么存储?

二进制中最高位表示正负(1为负,0为正)

byte的长度为8位,那么第8位便表示正负(符号位是固定的)

说一下二进制中的原码、反码、补码的概念

先用一个正数1举例

原码:0000 0001

反码:0000 0001

补码:0000 0001

正数的原码=反码=补码

对于-1来说

原码:1000 0001

反码:1111 1110(符号位不变,其他相反)

补码:1111 1111(补码是反码+1)

按以上原理

+0的原码是0000 0000

-0的原码是1000 0000

实际上,”+0“和“-0”的原码统一为0000 0000

1000 0000没有使用,所以就将其分给了最小的负数

现在开始解答最开始的疑惑

Java的整数默认是int类型的

所以128的

原码:0000 0000 0000 0000 0000 0000 1000 0000

反码:0000 0000 0000 0000 0000 0000 1000 0000

补码:0000 0000 0000 0000 0000 0000 1000 0000

byte类型截取后8位

即:

原码:1000 0000(最高位为1,表示负数)

反码:1111 1111

补码:1000 0000

1111 1111+1不应该是1 0000 0000然后截取后8位是0000 0000吗?

在补码的过程中,符号位不能改变

前面也说了,1000 0000表示的是最小值,所以是-128

这叫上溢

在试一个129(默认int类型)

原码:0000 0000 0000 0000 0000 0000 1000 0001

反码:0000 0000 0000 0000 0000 0000 1000 0001

补码:0000 0000 0000 0000 0000 0000 1000 0001

byte类型

原码:1000 0001

反码:1111 1110

补码:1111 1111

也就是-127

上溢那么就有下溢

以-129为例(byte最小值为-128)

先默认以int类型存储

原码:1000 0000 0000 0000 0000 0000 1000 0001

反码:1111 1111 1111 1111 1111 1111 0111 1110

补码:1111 1111 1111 1111 1111 1111 0111 1111

byte类型

原码:0111 1111

反码:0111 1111

补码:0111 1111

真值是127

注意:计算机都是以补码来存储的,正数的原码、反码、补码是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值