深刻理解计算机系统cp1:存储单位与编码

摘要: 理解计算机是如何存储数据的。git

Fundebug经受权转载,版权归原做者全部。github

1. 存储单位

  • 位:即 bit,表示二进制位,要么是 0 ,要么是 1。它是计算机内部数据存储的最小单位。好比 11010100 共有8个二进制位,是一个8位二进制数。
  • 字节:即 byte,它由8个二进制位构成,即 1byte=8bit,是计算机内部计量的基本单位。一个英文字符占1个字节(8位),一个汉字占2个字节(16位)
  • 字:即word,它由若干个字节构成,是计算机内部进行数据处理和运算的基本单位。字的总的位数称为字长,不一样档次的计算机字长是不同的,好比32位机,它的1个字由4个字节构成,字长为32位,也就是说其CPU一次操做处理的实际位数是32位。同理,64位机能够处理64位。因而可知,计算机的字长越大,其性能越优越。
  • KB,MB:1024byte = 1KB,1024KB = 1MB。往上还有GB,TB。

PS:数据传输大多以 bit 为单位,好比咱们常说的网速100M/s,M/s其实Mbit/s,也就是兆比特每秒,咱们还能够写成100Mbps。编程

2. 编码

2.1 为何须要编码?

  • 计算机只能理解0和1,没法理解英文、字母、汉字和其余特殊字符,这些字符须要通过编码才能成为计算机能够理解的二进制数。
  • 由字符到二进制数称为编码,反过来则是解码。
  • 从字符到二进制数,须要有一个一一对应的映射,这个映射经过编码规则来实现。
  • 一般所说的编码其实包括编码+字符集(即字符的集合体),好比 Unicode 字符集,就有 UTF-8,UTF-16 等多种编码。

2.2 编码规则的演变

  • ASCII:小程序

    1. /ˈæski/,即 American Standard Code for Information Interchange,美国信息交换标准代码。原本一个字节有8位,每一位有0和1两种状态,则一个字节共有2^8=256种状态,能够表示256种字符。可是美国佬比较自私,以为只要能够表示本身的字母和一些特殊字符就足够了,因此 ASCII 没有占用最高位(而是固定为0),实际只用到了后面7位,它能够表示 2^7=128 种状态,也就是表示128个字符。segmentfault

    2. 很显然,这用来表示字母是足够的,但要想表示其它语言的字符,128仍是太少了。微信小程序

    PS:附送 ASCII 对照表一张:微信

  • GB2312:性能

    1. 既然美国佬只解决了字母和特殊符号的编码问题,那么咱们中国人只好实现本身的编码,从而来表示汉字了。因此这时候出现了 GB2312 编码(国标码)。编码

    2. 问题:不幸的是,各个国家都是这么想的,因此小日本有了 Shift_JIS 编码,棒子有了 Euc-kr 编码…..一时之间各国都有了本身的标准,那么对于一个多语言混合的文原本说,存在着不一样的编码规则,最终必然致使乱码。debug

  • Unicode:

    1. Unicode 解决了编码统一的问题。每种语言的每一个字符在 Unicode 的规则下,都只有统一且惟一的对应二进制编码。它的表示方法是U+[16进制数]。例如,大写字母 A 编码为 U+0041,汉字“严”编码为 U+4E25

    2. 问题:Unicode 通常用2个字节(也就是16位)表示一个字符,这在表示 ASCII 字符的时候会出现问题。咱们知道,ASCII 字符实际只须要一个字节就够了,而且最高位甚至都还不须要用到,可是 Unicode 又规定表示一个字符至少须要2个字节,那么一个 ASCII 字符前面就必需要补0以知足这个规则,例如字母 A 就须要用 00000000 01000001 表示,这些多余的0是一个极大的资源浪费。

  • UTF-8:

    1. UTF:实际传输过程当中,基于不一样的系统平台,对 Unicode 会有不不一样的实现方式,其实现方式称为 Unicode Transformation Format,即 UTF。

    2. 做为 Unicode 的一种实现方式,UTF-8 展示了必定的灵活性——它是一种变长编码,会根据具体字符来改变所须要的表示字节。其编码规则只有两条:

    i>. 对于 128 个 ASCII 字符只需一个字节表示,字节的第一位补 0,后面 7 位为这个字符的 ASCII 二进制数。Unicode 范围为 U+0000 至U+007F。

    ii>. 对于 n 字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一概设为 10。剩下的没有说起的二进制位,所有为这个符号的 Unicode 码二进制数。Unicode 范围由 U+0080 起。

也能够看下面这张图:

以汉字“严”为例,演示如何实现 UTF-8 编码。

“严”的 Unicode 是 U+4E25(二进制数 100111000100101),据表,U+4E25 处在第三行的范围内(U+0800 ~ U+FFFF),所以“严”的UTF-8 编码须要三个字节,即格式 1110xxxx 10xxxxxx 10xxxxxx。而后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的 x,多出的位补 0。这样就获得 UTF-8 编码(二进制)是 11100100 10111000 10100101,转换成十六进制就是 E4B8A5

参考:

关于Fundebug

Fundebug专一于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了20亿+错误事件,付费客户有阳光保险、核桃编程、荔枝FM、掌门1对一、微脉、青团社等众多品牌企业。欢迎你们免费试用

相关文章
相关标签/搜索