2021-05-14

关于计算机存储数据问题

最近在学习的时候解决了一个困扰我很久的问题
我简单举一个列子

public class bianma {
     
    public static void main(String[] args) {
     
        int a=127;
        byte a1=(byte)a;//强制类型转换
        System.out.println(a1);
        }
}

在这里我们能得到结果128
但是如果我们做出一些改变

a=128;
        a1=(byte)a;
        System.out.println(a1)

我们得到的结果是-128
为啥事-128,大多数初学者都是一知半解

首先,我们知道byte类型的存储大小是1个字节的,也就是8bit位,取值大小范围:-128到127
当a=127的时候,将它赋给a1还没有超出byte的取值范围
但是当a=128的时候,将它赋给a1超出取值范围,输出a1得不到我们想要的数

    其次:我们要知道计算机是采用补码存储数据(还不清楚补码是啥的去百度)
    127它的源码等于补码是01111111将int类型的127转换成byte类型砍掉前面的3个字节
    其实前面的3个字节中存的也都是零,所以赋给byte类型的的补码一样也是01111111
    补码:01111111表示的数是127
    同理:
    128赋给byte类型的补码是10000000,注意最前面是1表示的是负数
    补码:10000000表示的数是-128

动笔算一下,下面输出结果是:

        int a=-129;
        byte a1=(byte)a;
        System.out.println(a1);

正确答案:127,你算对了吗?

你可能感兴趣的:(java)