二进制是计算机的基础,数据的存储在底层看来均是由二进制来表示的,那么如何用二进制来表示各种数据呢?此时就需要设计出一套完整的科学的储存方案
整型数据的存储
整型数据包括 short
, int
, long
等,其中最为常用的便是 int
,在目前的系统中(32位和64位编译器,以C语言为主要实例),其所占字节如下:
数据类型 | 所占字节 |
---|---|
short |
2 |
int |
4 |
long |
8 |
而整型数据的存储都是类似的,也就是以二进制方式进行存储,所以很容易理解,但是与日常使用的二进制数不同的是,在计算机储存中,为了方便地计算加减法,我们实际储存的是二进制数的 补码1:
示例
下面写几个简单 int 类型数字的在计算机中的二进制储存方式:
十进制 | 二进制(int ) |
---|---|
10 | 00000000 00000000 00000000 00001010 |
-10 | 11111111 11111111 11111111 11110110 |
0 | 00000000 00000000 00000000 00000000 |
注:字符型(即 char
)的存储方式和整数型一致,只不过仅占一个字节
浮点型数据的储存
浮点型数据由于有了小数点,小数点后的位数甚至可能是无穷的,那么此时我们就无法再采用和整型数据存储相同的方式了,必须有一种新的存储方法
浮点型数据最常见的有 float
和 double
,两种数据类型分别占4字节和8字节
所以,要在固定的位数中表示出各种浮点数,计算机中采取了如下方案:
下面以 float
为例进行说明:
从左到右:第一个 bit
为符号位,接下来的8个 bit
为整数位,后 23 个 bit
为小数位,依次为\(2^{-1}, 2^{-2}, ...\) ,如下图所示:
所表示的数字,由以下方式叠加:\((-1)^m * 1.XXXX * 2^{exp-127}\)
说明:
XXX
为小数位所表示的数字exp
为整数位数字的大小- 综上所述,
float
可表示从 $2^{-127} $ 到 \(2^{128}\)的数字
二进制的表示方式,具体计算方法为:正数补码不变,负数的补码等于反码加一↩