如何储存数据

309 阅读6分钟

一、二进制

1、十进制转二进制

①问31如何凑成下列等式

②答案为

③那么31的二进制为011111

2、二进制转十进制

①二进制数字100011

②写出式子

③最后上式等于35,即为100011的十进制表示

二、十六进制

1、优点

因为二进制写起来太慢了:

2、二进制转十六进制

  1. 二进制数:011110001011010
  2. 记住8421对应XXXX
  3. 从右往左每四位改写成一位:011 1100 0101 1010

  1. 得到3,12,5,10

  2. 把大于9的数字改为ABCDEF

  3. 于是得到3C5A

3、16进制数:从0000到FFFF一共有62236个

  • 一个16进制包含四个{由0和1组成的四个数字组合}的组合,所以一共有16个0或1。
  • 所以总共有2的16次方=62236个16进制数字

3、用计算器的程序员模式

HEX表示16进制,BIN表示2进制 OCT表示8进制,DEC表示10进制

三、数字储存方式--存二进制数

把十进制的数字转成二进制便可储存

四、字符储存方式--字符编码--存编码

(一)ASCII 码

  1. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。

  2. ASCII 码一共规定了128个英文字符的编码

  3. 编码方式:先把这128个字符按照顺序给它一个十进制数字(从0到127)来编号,如下图。

  • 然后储存时便会把这些字符的十进制数字变成二进制数字储存
  1. 比如
  • 0表示结束字符
  • 10表示换行
  • 13表示回车
  • 32(二进制00100000)表示空格
  • 33到47表示标点
  • 48到57表示数字符号
  • 49(二进制00110001)是数字符号1
  • 65到90表示大写字母
  • 65(二进制01000001)是大写的字母A
  • 97到122表示小写字母
  • 97(二进制01100001)是小写字母a
  • 127表示删除键(二进制01111111)
  1. 2的七次方为128,所以128的二进制为1000 0000
  2. 因为这128个字符的十进制数最高是127(二进制111 1111),所以换成这128个字符在二进制里最多七位。
  3. 一个字节是八位
  4. 所以这128个符号,只占用了一个字节的后面7位,最前面的一位统一规定为0。

(二)GB2312

  1. 《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB2312
  2. 共收入汉字6763个和非汉字图形字符682个。
  3. 编码方式:用16进制(从0000到FFFF)来编号。占用两个字节。然后储存时便会把这些十六进制数字变成二进制数字储存
  4. 例如
  • 「你」的GB2312编号为C4E3
  • 「牛」的GB2312编号为C5A3

(三)GBK

  1. 厂商微软利用GB2312未使用的编码空间,扩展了GB2312的范围,含21886个汉字和图形符号,收录了中日韩使用的几乎所有汉字,完全兼容GB2312
  2. 编码方式:同GB2312,用16进制(从0000到FFFF)来编号。占用两个字节。然后储存时便会把这些十六进制数字变成二进制数字储存

(四)Unicode万国码

  1. 将世界上所有的符号都纳入其中的一个字符集,已收录13万字符(大于16位),全世界通用。而且一直在更新中。
  2. 每个字符占三个及以上字节。所以很占内存。
  3. 字符编码UTF-8

(1) Unicode 的实现方式之一。

(2)它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

(3)这样就节省了不必要使用的空间

(4)UTF-8中8是指最少可用8位,也就是一个字节,来存一个字符

(5)例如存储「a」

  • a对应的Unicode编号为97,十六进制为61
  • Unicode直接存:00000000 00000000 01100001
  • UTF- 8偷懒存法:01100001
  • 三字节变一字节,比GBK还省

(6)例如存储「你」

  • 你对应的Unicode编号为4F60
  • Unicode直接存:00000000 01001111 01100000
  • UTF-8偷懒存法:11100100 10111101 10100000
  • 还是三字节,汉字似乎没有省,但是字母都能省一点

(7)UTF-8 的编码规则很简单,只有二条:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

  • 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

(8)举例:以「你a」为例

  • 11100100 10111101 10100000 01100001
  • 读8位信息11100100
  • 发现开头有3个1,说明这个字符有3个八位
  • 于是再读两个8位信息10111101 10100000
  • 前面的10不要,其他合起来,得01001111 01100000
  • 这就还原为Unicode的你了:00000000 01001111 01100000
  • 再读8位信息01100001
  • 发现开头是0,说明这个字符只占8位
  • 这就还原味Unicode的a了:000000000000000001100001

五、问题

  • 最后都是都是存数字0101010101,计算机咋知道你存的是数字的010101还是字符的01010101
  • 答:计算机不知道。需要我们用一些辅助方式提醒计算机,比如加后缀(.txt就是存字符的编码,Excel就是存数字的数字)

六、引用资料

阮一峰的网络日志