内存如何存储 0 和 1 的

计算机只能存储 0 和 1,那它是怎么存储 0 和 1 的了?

每个微晶体管就是一个 BIT (BInary digiT),一个字节是 8 个 bit,就是一排晶体管(一排 8 个)

🤔 Why is a byte EXACTLY 8 bits?

“字节”是在 1950 年代创造的,用于指代 IBM 7030 Stretch 计算机中可寻址的内存存储单元。一个字节的大小是可变的,在指令中指定,拼写为“字节”是为了避免冲突缩写为位。

早期的计算机并不是 8 位字节。以前也有过 4 位、6 位、 7 位字节,是基于它们使用的字符集以及硬件设计者的选择。

后来受欢迎的 IBM System / 360 大型机使用了 8 位字节,这有助于提高 8 位字节的流行度。大约在同一时间,AT&T开始引入 8 位编码,用于通过其线路以数字方式传输声音,这也使得 8 位数据传输大小便于通过 AT&T 线路传输。

因此,到20世纪70年代初,微型计算机首次被设计时,已有十年以 8 位块编码数据。因此,早期的微型计算机围绕 8 位数据设计,因此它们使用 8 位字节。

出于某些原因,IBM 选择将 8 位字符用于其 System / 360。第一个是他们想要一个大致与他们之前编码兼容的字符代码(其历史可追溯到最初设计于1800年代后期的计算机前打卡系统),希望足够大,可以容纳他们觉得有必要处理的所有角色。所以他们选择了 8 位。

还有主要商业计算架构的普及,也是有助于无处不在地接受 8 位字节大小的。

先选中竖排 8 个点,计算机把这一竖排充满电,但并不代表这个电池有电,然后横排开始向 8 个点输送电量,先第一横排,如果是 1 就给竖排第一个电池充电,如果是 0 就给竖排第一个电池充电。然后看第二横排,如果是 1 就给竖排第一个电池充电,如果是 0 就给竖排第一个电池充电。依此类推,直到这个竖排的电池充完电。读取时,如果电量大于 50% 就是 1, 如果小于 50% 就是 0。

电池的电量会自动消耗,电池怎么长久存,计算机的电池耗电很快,充电大概几纳秒,充完几毫秒就耗完了。计算机通过刷新来重新充电。cpu 的多少 hz,就是说没秒能重多少次电。

如何存储数字

可以存二进制了,那十进制怎么存?那就把十进制转成二进制来存。

37(10) = 3*10^1 + 7*10^0
= n1*2^? + n2*2^?
= 32 + 4 + 1
= 1 * 2^5 0 0 + 1*2^2 + 0 + 1*2^0
= 100101(2)

负数用补码存储

0.75(10) = 7*1/10 + 5*1/10^2
= n1*1/2 + n2*1/4 + ..
= 0.5 + 0.25
= 1*1/2 + 1*1/4
= 0.11(2)

小数用浮点数存储

为了方便书写,一般会将二进制存为十六进制。

如何存储字符

将每个字符编号,ASCII 美国信息交换标准代码。

在计算机中,1 个字节对应 8 位二进制数,而每位二进制数有 0,1 两种状态,因此 1 个字节可以组合成 256(28)种状态。如果这 256 种状态每一个对应一个符号,就能通过 1 个字节的数据表示 256 个字符。

上世纪 60 年代,美国制定了一套编码,ASCII(发音 /ˈæski/)码,全称为 American Standard Code for Information Interchange 美国信息交换标准代码。

ASCII 码一共定义了 128 个字符的编码,比如空格 SPACE 的二进制形式为 0010 0000,大写字母 A 的二进制形式为 0100 0000。这 128 个字符,其中包括 32 个不能打印出来的控制符号,都只使用了 8 位二进制数中的 后 7 位,最前面的一位统一规定位 0。

如果存储 a,对应 ASCII 表中的 97 对应的二进制。

a -> 9710 -> 0110 00012 -> 6116

如果存储 1,1 是字符 1,不是数字 1,对应 ASCII 表中的 49,修改为对应的二进制。

1 -> 4910 -> 0011 00012 -> 3116

如何存储中文

中国国家标准局发布一个标准 扩充了一下 ASCII,增加 6763 个汉字,682 个字符:GB 2312。GB Guo Biao 国标。2^16 双字节存中文。

后来为了存储生僻字、繁体字、日语等。微软推出 GBK 字符集。GBK Guo Biao Kuo 国标扩。

国标又推出一个 GB 18030。

如何存储所有字符

将全球字符编号:Unicode 字符集。包含所有文字,比如日韩、藏文、盲文、绘文字、颜文字。

到 2016 年 6 月,Unicode 表已经有 128237 个字符。2^32 四个字节存所有字符。

如何将Unicode 存到计算机

a -> 00000000 0000000 0000000 011000012 = 006116

你 -> 0000000 0000000 01001111 01100000 = 4F601

32 位存储占用的存储空间太多,所以后来又有了 UTF-8 编码方式:

a -> 01100001

你 -> 11100100 10111101 10100000

第一个字节的前 4 位 1110,第二个字节的前 2 位 10,第三个字节的前 2 位 10。

UTF-8:
32 位 Unicode :00000000 00000000 00000000 011111111
转为 UTF-8 :0xxxxxxx
对应十六进制 0000007F 以下值

32 位 Unicode :00000000 00000000 00000111 111111111
转为 UTF-8 :110xxxxx 10xxxxxx
对应十六进制 000007FF 以下值

32 位 Unicode :00000000 00000000 11111111 111111111
转为 UTF-8 :1110xxxx 10xxxxxx 10xxxxxx
对应十六进制 0000FFFF 以下值

32 位 Unicode :00000000 00011111 11111111 111111111
转为 UTF-8 :11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
对应十六进制 0000FFFF 以下值

可以看到 第一个字节的前面几位的1 加上 0 ,后面字节的第 1,2 位的 10 都用来表示字节位数标识,其他剩余的位数存有效二进制数值。

字符集历史问题

JavaScript 是 95 年发布的。它用的也是 Unicode,只是是 Unicode 的早起版本 UCS-2,UCS-2 是后来合并到 Unicode 的。缺点是只能表示两个字节。无法表示 \uFFFF 之后的字符。F 表示 4 个位,FFFF 表示 2 个字节。