基本数据类型的范围表示计算

一、基本数据类型

基本数据类型:四类八种
整型浮点型字符型布尔型
数据类型字节型短整型整型长整型单精度浮点数双精度浮点数字符型布尔型
关键字byteshortintlongfloatdoublecharboolean
包装类ByteShortIntegerLongFloatDoubleCharacterBoolean
内存占用

1 byte

8 bit

1个字节

即8个比特位

2 byte

16 bit

2个字节

即16个比特位

4 byte

32 bit

4个字节

即32个比特位

8 byte

64 bit

8个字节

即64个比特位

4 byte

32 bit

4个字节

即32个比特位

8 byte

64 bit

8个字节

即64个比特位

2 byte

16 bit

2个字节

即16个比特位

明确规定

表示范围-2^{7} ~ 2^{7}-1-2^{15} ~ 2^{15}-1-2^{31} ~ 2^{31}-1-2^{63} ~ 2^{63}-1知道有范围,但一般不关注0 ~ 65535

true

false

                           注意:

                           计算机的最小单位:bit(比特)

                           计算机的基本单位:byte(字节)

                           计算机的最小存储单位:byte(字节)

                           换算:1 byte = 8 bite ( 1个字节 = 8个比特位 )

                                      1 kb = 1024 byte

                                      1 mb = 1024 kb

                                      1 gb = 1024 mb

二、机器码、真值、原码、反码与补码  

在探究各个数据类型所表示范围前,要先引入几个名词解释,即:机器码、真值、原码、反码、补码

机器码 :现实世界中的一个数字在计算机系统中的二进制表示形式。

               以一个byte类型的 +3 举例,

               其二进制表示形式为 0000 0011 ,其中第一位 0 表示正数,后七位 000 0011 表示数值 3 ,合起来,就转换为十进制就是 +3 。

               以一个byte类型的 -3 举例,

               其二进制表示形式为 1000 0011 ,其中第一位 1 表示负数,后七位 000 0011 表示数值 3 ,合起来,就转换为十进制就是 -3 。

真值:带符号机器数真正的数值,被称为该机器的真值。

原码 : 符号位 + 真值的数值位。

        如 -3: 1  +   000 0011

如下列计算
  1 - 2
= 1 + (-2) 
=(0000 0001)原 + (1000 0010)原
=(1000 0011)原
= -3

很显然计算结果是错误的,此时便要引入 反码 的概念。

反码:反码的表示与符号位有关。

           正数的反码是其原码本身。

           负数的反码是其原码保持符号位不变,其余每一位都取反。

继续进行下列计算
  1 - 2
= 1 + (-2) 
=(0000 0001)原 + (1000 0010)原
=(0000 0001)反 + (1111 1101)反
=(1111 1110)反
=(1000 0001)原
= -1

 1 - 2 是计算对了,但当我们计算 1 - 1 时

继续进行下列计算
  1 - 1
= 1 + (-1) 
=(0000 0001)原 + (1000 0001)原
=(0000 0001)反 + (1111 1110)反
=(1111 1111)反
=(1000 0000)原
= -0

此时我们得到一个结果是 -0 ,0已经有 0000 0000 来表示了,那多出来的 -0 怎么解决呢 ,此时便要继续引入 补码 的概念

补码:补码的表示与符号位有关。

          正数的补码是其原码本身。

          负数的补码是其原码的反码再加一。

此时我们继续解决以下计算
  1 - 1
= 1 + (-1) 
=(0000 0001)原 + (1000 0001)原
=(0000 0001)反 + (1111 1110)反
=(0000 0001)补 + (1111 1111)补
=(0000 0000)补
=(0000 0000)原
= 0

从而得出正确的计算结果,由此我们可以得知 计算机的底层都是补码进行存储。

三、由byte引申的数据类型范围表示

此时我们再回到一开始提到的探究各个数据类型所表示的范围。

由byte来举例子,byte是计算机中的基础单位,也是最小的储存单位。1 byte = 8 bit

显而易见,我们可以计算得到byte类型所表示的范围中的最小值和最大值
  最小值
  1111 1111
= -(2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0)
= - (64 + 32+ 16 + 8 + 4 + 2 + 1)
= - 127

  最大值
  0111 1111
= +(2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0)
= + (64 + 32+ 16 + 8 + 4 + 2 + 1)
= + 127

由于补码的存在,已经有一个(0000 0000) +0 ,用来表示0,而多出来的(1000 0000)-0 就视为最小值,作为-128 存在。

实际上 -128 在8位比特下是没有明确的机器码进行表示,只是将(1000 0000)这一特殊的存在来作为最小值,即 -128。

所以8比特位的整数的最小值是 -128 , 所以 byte 的取值范围就是(-128 ~ +127),也可以写作(-2^{7} ~ 2^{7}-1)。

由数据类型byte可得:

整数类型:

字节型 byte 占 1个字节,即 8个比特位,表示范围是(-2^{7} ~ 2^{7}-1)。

短整型 short占 2个字节,即 16个比特位,表示范围是(-2^{15} ~ 2^{15}-1)。

整型 int占 4个字节,即 32个比特位,表示范围是(-2^{31} ~ 2^{31}-1)。

长整型 long占 8个字节,即64个比特位,表示范围是(-2^{63} ~ 2^{63}-1)。

浮点数类型:

单精度浮点数 float占4个字节,双精度浮点数 double占8个字节

由于浮点数与整数在内存中的储存方式不同,不能单纯用2^{n}的形式计算范围,所以知道有范围,但一般不关注。

字符类型:

字符型 char占 2个字节,表示16位Unicode字符,表示范围是(0 ~ 65535)。

布尔类型:

布尔类型 boolean没有明确规定内存占用,范围只有 true 和 false。

四、引申Question:为什么 127 + 1 = -128 ?

1. 通过 127 + 1 进行解释 

我们已知,计算机内部的计算都是使用的二进制补码来进行计算的。
127的补码是(0111 1111)
1的补码是(0000 0001)
  127 + 1
=(0111 1111)补 + (0000 0001)补
=(1000 0000)补 
而二进制补码(1000 0000)所对应的十进制数就是 -128
所以 127 + 1 = -128

2. 通过 127 + 2 进行解释 

我们已知,计算机内部的计算都是使用的二进制补码来进行计算的。
127的补码是(0111 1111)
2的补码是(0000 0010)
  127 + 2
=(0111 1111)补 + (0000 0010)补
=(1000 0001)补 
而二进制补码(1000 0001)所对应的十进制数就是 -127
所以 127 + 2 = -127
则   127 + 1 = -128

3. 通过代码解释

public class HelloWorld {
    public static void main(String []args) {
		byte a = 127;
		a++;
       System.out.println(a);
    }
}

输出 -128
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值