计算机是如何存储的

计算机:二进制的世界

1110 0100 1011 1101 1010 0000 1110 0101 1010 0101 1011 1101
上面一行字就是“你好”在计算机中的表示方式

下面就来聊一聊计算机存储的过程

第一步:内存如何存储 0 和 1 ?

image
  • 存储
    图中模拟计算机存储 0 和 1 的过程,所示的是一个8*8的晶体管方阵,可以将每一个圆点当作看成是一个小电池,当需要存储一串二进制信息时,竖向存选中(1或0),横向输送电量,1就充电(显示红色),0就不充电(显示白色)。
  • 读取
    晶体管存电很少,耗电很快(ms),需要多次刷新,在耗尽电量之前进行充电(ns),要保证1还是1(电量大于50%就是1,电量小于50%就是0)。
    CPU的赫兹就是每秒刷新多少次
    通过计算机能够存储 0 和 1,程序员将世间万物的信息存进了计算机。

第二步:如何存储数字?

十进制转二进制

  • 正数存储
    37(10)=3 * 10 ^1 + 7* 10^0 = 32 + 4 + 1=1 * 2^5 + 1 * 2^2 + 1 * 2^0=100101(2)
  • 负数存储
    由于计算机只能存储0和1,负号不能存储,负数会以补码形式存储
    -37(10) == -100101(2)
  • 小数存储
    把十分之一为底的数变成以二分之一为底的数,由于计算机只能存储0和1,小数会以浮点数的形式存储
    0.75(10) = 0.5 + 0.25 = 1 * 1/2 + 1 * 1/4 = 0.11(2)
    为了方便书写,一般会将二进制数写为十六进制数

第三步:如何存储字符

将每个字符编号,外国人将每个字符进行了编号0~127共128个ASCII码值。
ASCII美国信息交换标准代码

image

如果你想储存 a,那么就储存 97(10) 对应的二进制
a -> 0110 0001(2) -> 61(16)

如果你想储存 字符1,那么就储存 49(10) 对应的二进制
1 -> 0011 0001(2) -> 31(16)

为方便书写将二进制转成十六进制

第四步:如何存储中文

我国制定了常用中文字符集GB 2312 中国国家标准字符集)

而后微软将一些生僻字日韩字符等加入后推出了
GBK字符集

第五步:如何存储所有字符

Unicode 字符集

将全球文字统一到一个表里面,包括中日韩文字、藏文、盲文、楔形文字、颜文字:-)、绘文字😂
第六步:如何将Unicode存到计算机里
Unicode 需要使用 32 位(4字节)来存储字符,他的存储方式如下

//低效率方式
a -> 0000 0000 0000 0000 0000 0000 0110 0001 = 0061
你 -> 0000 0000 0000 0000 0100 1111 0110 0000 = 4F60 

由于其表示简单的字符时也使用4个字节,浪费了很多资源,为提高效率,人们开始使用UTF-8,UTF-8是Unicode存到计算机的一种编码方式,它不是字符集,它可以用来表示Unicode标准中的任何字符。

//高效率方式 UTF-8
a -> 01100001
你 -> 11100100 10111101 10100000 
  • 像“a”这种较短的字符(小于七位的),我们可以直接在前面补零表示
  • 像“你”这种长的字符,由于计算机读取时无法弄清楚是存储了一个 由两个一字节组成的字符还是一个由两字节组成的字符,解决步骤(UTF-8):
    1. 我们从高位依次划分6个字符进行分组,直到分出的组不足6个。即:0100 111101 100000
    2. 分别在每一组前面补全读取这一串二进制信息的规则,即:1110XXXX 10XXXXXX 10XXXXXX
    3. 1110XXXX:111表示计算机需要读取3个字节,每个字节的开头都是10,10+XXXXXX、10+XXXXXX: 所以后两个分组的开头也补上10,说明是和第一个字节一起的,组成一个字符。只有X才是原二进制有效的数据

UTF-8

UTF-8 是一种编码方式,不是字符集,更高效的将Unicode存储到计算机中

现实问题

编码问题

JavaScript 使用了 Unicode 字符集,但没有使用 UTF-8 编码
JavaScript使用 UCS-2 编码,因为1995年 UTF-16还没有发明出来,JavaScript也不想使用 UTF-32

后果

ES5 无法表示 \uFFFF之后的字符(如 \u1D306),某些情况下会出bug
语言层面的问题,需要留心。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267