二进制是计算机的基础,数据的存储在底层看来均是由二进制来表示的,那么如何用二进制来表示各种数据呢?此时就需要设计出一套完整的科学的储存方案

整型数据的存储

整型数据包括 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)的存储方式和整数型一致,只不过仅占一个字节

浮点型数据的储存

浮点型数据由于有了小数点,小数点后的位数甚至可能是无穷的,那么此时我们就无法再采用和整型数据存储相同的方式了,必须有一种新的存储方法

浮点型数据最常见的有 floatdouble ,两种数据类型分别占4字节和8字节

所以,要在固定的位数中表示出各种浮点数,计算机中采取了如下方案:

下面以 float 为例进行说明:

从左到右:第一个 bit 为符号位,接下来的8个 bit 为整数位,后 23 个 bit 为小数位,依次为\(2^{-1}, 2^{-2}, ...\) ,如下图所示:

示意图
示意图

所表示的数字,由以下方式叠加:\((-1)^m * 1.XXXX * 2^{exp-127}\)

说明:

  1. XXX 为小数位所表示的数字
  2. exp 为整数位数字的大小
  3. 综上所述,float 可表示从 $2^{-127} $ 到 \(2^{128}\)的数字

  1. 二进制的表示方式,具体计算方法为:正数补码不变,负数的补码等于反码加一