数据类型是学习任何语言的基础
二进制的由来
计算机有电才能工作,电子通过两种状态传递信息,高电频表示1 低电频表示0
为什么又有八进制、十六进制呢
二进制表示一个数太长啦,显示太不方便,八进制、十六进制与二进制相互转化方便
1Bit(比特)表示一位二进制
1Byte(字节) = 8Bit(比特)
1Kb(千字节) = 1024Byte
1Mb(兆字节) = 1024Kb
1Gb(吉字节) = 1024Mb
1Tb(太字节) = 1024Gb
我们平常说的你电脑内存是8G 还是16G的,就是8吉字节 16吉字节
内存中的数据的存取是以字节为单位,超级重要!!!
数据类型的由来
计算机源于生活而设计,不同的数据类型可以理解为不同的单位
就像我说我口袋有100块钱,我有多少钱???
显然这是不确定的,可能是100人民币,100美元
以java中8种基本数据类型为例
不同的数据类型占不同的内存空间大小
数据存储在计算机里面的都是二进制补码
原码、反码、补码
正数:原码 == 反码 == 补码
负数:二进制的最高位表示符号位,其它位表数据位
补码的计算方法:
1.写出该数的原码
2.符号位不变,其他位按位取反是反码
3.反码加 1 是补码
下面所讨论的取值范围和计算都以1字节byte为例
例如:byte = -1
为什么会有补码???只用反码不行嘛,那肯定不行咯
其实很简单:看几个计算的例子
需要注意的是:(很重要)
符号位也是数据,是数据就要参与运算
如果数据类型放不下该数据,发生截断
cpu只有加法寄存器所以 1 - 1 等价于 1 + (-1)
如果只用最高位区分正负,计算过程如下
可以,看似没什么问题
再来 =_=
出问题了哎!!!
-127+(-1)很好理解,因为已经超出数据范围了,超出规范了,结果也不会规范
-1+2怎么等于0呢,比原结果少1,是不是巧合?
看下面的表
结论:在负数参与运算时,如果跨越了0,0会被使用两次,所以结果少1
如何解决负数计算的跨0问题 - 补码诞生
早期的程序员都是伟大的数学家,他们巧妙的进行了错位,设计出了补码
把所有负数的反码都加1,为补码,例如:-0的补码是0000 0000
所有负数的补码是由它上一个数的反码得来,看表
小细节1
但是,就算是有了补码
+0跟-0都是零,重复了,计算机是不会浪费这样一个存储空间的
-0要么表示-128,要么表示128,在这-0表示-128
推导过程(理解不了记结论)
但是1000 0000往回推是推不出来它表示十进制-128的
因为已经发生了截断,计算机看到这个二进制直接把它解释为-128
可以理解为-128没有原码和反码
还有个小细节
-128-1是谁呢(cpu只有加法寄存器)
那127+1呢
示意图
如何得来,以byte为例
byte 占1个字节 8 个比特位,有符号,最高位表符号,7位表数据
一位能表示0和1 (2^1), 两位能表示0 1 2 3 (2^2)
依次类推7位能表示(2^7)个数,0也在内,正数范围就是0 - 127
负数0 - (-128)
不要忘了小细节:
-128的二进制是直接被解释的
取值范围计算公式(不需要记,理解即可)
n表示有几个比特位
无符号数:【0, 2^n-1】
有符号数:【-2^(n-1)-1, 2^(n-1)-1】
了解原反补的由来这取值范围不轻轻松松搞定
完美撒花撒花