天天看点

【Java中的二进制】

计算机看似能干很多活,其实也很苯,只认识0和1。因为电路的逻辑只有0和1两个状态,这里的0和1并不是数字的0和1,0和1是表示两种不同的状态,0表示低电平,1表示高电平。计算机是由无数个逻辑电路组成的,通过0和1的无限位数和组合来表达信息。也就是说,计算机是采用二进制来表示数据的。为了说清楚二进制,先说一下我们生活中常用的十进制,十进制看起来很简单,那是因为我们从小接受的就是十进制的教育:

【Java中的二进制】

这是一个普通的十进制数,八十三万七千零五十六,这个数字可以表示如下:

【Java中的二进制】

再来看看二进制

【Java中的二进制】

这是一个二进制数101011,这个数字可以表示如下:

【Java中的二进制】

和十进制一样,只不过把底数(幂)从10变成了2,用十进制表示二进制里的101011就是43。有一点Java基础的人,都知道int类型在Java中是占4个字节的,1个字节8位,43表示如下:

【Java中的二进制】

其中每段为1个字节,一个字节是8位,首位表示符号位。在Java中,负数是用补码来表示的,也就是其绝对值取反加1得到的,并用首位来标识符号位为负数,看一下-43是怎么表示的:

1、先取反,取反其实很简单,就是0变1,1变0

【Java中的二进制】

2、加1

【Java中的二进制】

相信看到这里,大家就知道为什么int能表示的最大数和最小数分别是2147483647和-2147483648了。先看int的最大值2147483647,二进制是这样表示的,原来并不是定义的,只是说实在装不下了

【Java中的二进制】

再看看int里的最小值-2147483648,二进制是这样表示的

【Java中的二进制】

写到这儿了,再扩展一下知识点吧,来看一下32位的int类型转换成16位的short类型时,系统是怎么转换的,随手写了一个二进制数,相当于十进制的20080557

【Java中的二进制】

准备转换,截掉前面的16位

【Java中的二进制】

取后面的16位,并把第1位变为符号位

【Java中的二进制】

强制转换以后,十进制的20080557变成了十进制的26541,

整理了一个表格,帮大家回顾一下Java中的四种整形,byte,short,long这三种类型本文就不详细解说了,其中API的调用都是一样的

【Java中的二进制】

大家可以算一下 0x7FFFFFFF 是多少

每个十六进制数4bit,因此8位16进制是4个字节,刚好是一个int整型

F的二进制码为 1111

7的二进制码为 0111

这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1

就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)

用 INT_MAX 常量可以替代这个值。

在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。

C中int类型是32位的,范围是-2147483648到2147483647 。 

(1)最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN; 

(2)最严重的上溢是INT_MAX + INT_MAX :结果是-2; 

(3)最轻微的下溢是INT_MIN - 1:结果是是INT_MAX; 

(4)最严重的下溢是INT_MIN + INT_MIN:结果是0 。

内容相关引用链接:https://zhuanlan.zhihu.com/p/29187389