深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?

徐文浩 2019-05-20
上算法和数据结构课的时候,老师们都会和你说,程序 = 算法 + 数据结构。如果对应到组成原理或者说硬件层面,算法就是我们前面讲的各种计算机指令,数据结构就对应我们接下来要讲的二进制数据。
众所周知,现代计算机都是用 0 和 1 组成的二进制,来表示所有的信息。前面几讲的程序指令用到的机器码,也是使用二进制表示的;我们存储在内存里面的字符串、整数、浮点数也都是用二进制表示的。万事万物在计算机里都是 0 和 1,所以呢,搞清楚各种数据在二进制层面是怎么表示的,是我们必备的一课。
大部分教科书都会详细地从整数的二进制表示讲起,相信你在各种地方都能看到对应的材料,所以我就不再啰啰嗦嗦地讲这个了,只会快速地浏览一遍整数的二进制表示。
然后呢,我们重点来看一看,大家在实际应用中最常遇到的问题,也就是文本字符串是怎么表示成二进制的,特别是我们会遇到的乱码究竟是怎么回事儿。我们平时在开发的时候,所说的 Unicode 和 UTF-8 之间有什么关系。理解了这些,相信以后遇到任何乱码问题,你都能手到擒来了。

理解二进制的“逢二进一”

二进制和我们平时用的十进制,其实并没有什么本质区别,只是平时我们是“逢十进一”,这里变成了“逢二进一”而已。每一位,相比于十进制下的 0~9 这十个数字,我们只能用 0 和 1 这两个数字。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(41)

  • 豫樟 置顶
    这是因为9的ASCII码是0039,换算成二进制,就是0011 1001了

    作者回复: 👍

    2019-05-20
    8
  • 小海海
    1、-5 + 1那个表格的二进制结果好像写错了,应该是1100。
    2、补充一点对原码、反码、补码的理解:计算机中所有的加减法运算都可以转换为加法,所以一般ALU中也只实现了加法运算器,原码表示时正正、负负相加都没问题,而唯独正负相加的时候无法直接处理,如:0001(1)+1001(-1) = 1010(-2)但是结果本应该是0的,所以这时候聪明的计算机先驱们想到用反码来计算(正数的反码同原码,负数反码符号位不变,其余位取反)这样就解决了正负相加的问题,但是负负相加又有问题了,不过问题不大,可以转换为正正相加再把符号位置1即可,然后更聪明的先驱们又发明了补码(模的思想)...... 这里我放个链接:https://www.imooc.com/article/16813?block_id=tuijian_wz
    总结:大学学组成原理时对补码一直是懵的,今天借机回顾一把又有新收获,感谢老师。还有“烫烫烫”是当年的噩梦啊,现在终于搞懂原因了,哈哈哈。

    作者回复: 小海海同学你好,

    1. 的确手滑图上写错了,我改一下
    2. 很棒啊,谢谢你分享给大家

    2019-05-20
    27
  • Yuuuuu
    手持两把锟斤拷,口中疾呼烫烫烫
    脚踏千朵屯屯屯,笑看万物锘锘锘

    作者回复: 👍

    2019-05-20
    24
  • 铁皮
    老师,-5 + 1 = -4 的二进制的结果是不是错了?文中是“1110”,正确结果应该是"1100"吧?

    作者回复: 是1100

    2019-05-20
    8
  • -W.LI-
    老师好!二进制传输具体是怎么减少传输位数的啊。文中用了最大的32位数字解释。好想有点懂了,更多都是不懂:-(,非数字的具体是怎么变成二进制的。a是97用ASCII是0110 0001,十六进制61。字符串aa用ASCII就是4位。0110 0001 0110 0001。不晓得怎么压缩😂
    2019-06-02
    5
  • 猫头鹰爱拿铁
    [-5+4]补=[-5]补+[4]补=[1011+0100]补=[1111]补 原码1001

    作者回复: 👍

    2019-05-20
    5
  • lzhao
    在 ASCII 码里面,数字 9 不再像整数表示法里一样,用 0000 1001 来表示,而是用 0011 1001 来表示。

    这里不明白

    作者回复: ASCII码里面的9,其实是字符串的“9”,对应的二进制里面的表示是 0011 1001

    2019-05-20
    5
  • 一步
    文章中的这个写错了: “对应的二进制数,就是 1101” 应该是1011

    作者回复: 没有错哦,就是1101啊,13 = 8 + 4 + 0 + 1

    2019-05-20
    2
  • 小广
    徐老师你好,第二个表格最后一行,-4的二进制表示应该是1100,而不是1110,不知道是否笔误
    2019-10-27
    1
  • 心浮天空
    在开发接触最多的是字符集编码, 在对字符串与byte[]进行转换时, 需要指定编码格式, 无论是前端、后端、数据接口、数据库大多使用的都是UTF-8, 一般来说整个项目使用的编码格式是统一。
    对字符集而言, 在开发中从来没见过字符集的相关设定, 如何知道自己使用的字符集是什么,又如何保证开发环境和生产环境使用的字符集是一致的?
    2019-10-20
    1
  • DreamItPossible
    文中三种表示方法背后的思想是“一个数与其相反数之和为0”,用相反数来类比再合适不过了。

    课后作业题解答:

    使用原码表示-5+4=-1,记住最高位为符号位
    $$(-5+4)_原=(-5)_原+(4)_原=(1101)_原+(0100)_原=(1001)_原=-1$$
    使用补码表示-5+4=-1,记住最高位为符号位
    $$(-5+4)_补=(-5)_补+(4)_补=(1011)_补+(0100)_补=(1111)_补=-1$$
    2019-07-13
    1
  • 漏网之鱼
    在 ASCII 码里面,数字 9 不再像整数表示法里一样,用 0000 1001 来表示,而是用 0011 1001表示。
    转换方法:数字9的ASCII是0039,十六进制的0039转换成二进制就是0011 1001。
    2019-06-17
    1
  • 等风来
    二进制序列化存储和文本存储有点不明白, 文本存储是采用字符集编码,那二进制如何采用怎么方式存储呢
    2019-05-29
    1
  • 焰火
    希望浩哥有空的话,可以解答一下这几天前面几章大家问的问题,因为工作太忙,很多人不可能跟进度跟的这么紧 ^_^ 谢谢~~

    作者回复: 嗯,谢谢提醒。之前一段时间在东南亚出差,所以堆积了一些消息回复得不够及时,这两天正在加紧回复大家的问题呢。

    2019-05-21
    1
  • 庄风
    “就是把从右到左的第 N 位,乘上一个 2 的 N 次方”,应该是乘以2的N-1次方吧?

    作者回复: 作为程序员,所以从右到左是从第0位数起的啦。

    2019-05-20
    1
  • Smirk
    终于知道烫烫烫咋回事了……

    作者回复: 👍

    2019-05-20
    1
  • 庄小P
    首先,“锟斤拷”的来源是这样的。如果我们想要用 Unicod...果我们想要用 Unicode 编码记录一些文本,特别是一些遗留的老字符集内的文本,但是这些字符在 Unicode 中可能并不存在。于是,Unicode 会统一把这些字符记录为FFFD 这个编码。如果用 UTF-8 的格式存储下来,就是...

    这里的意思是说在文本中输入不在Unicode字符集的字符, 那这字符会长什么样子呢??老师,能不能举个例子呢。




    作者回复: 哈哈,有趣的问题,因为这个网页也是用的unicode加上utf-8,而回复里也不能放图,所以我还真没有办法给你看到。

    不过stackoverflow上有人问过类似的问题,所以你可以去看这个链接,里面有不支持的文字的图
    https://stackoverflow.com/questions/6276681/what-characters-are-not-present-in-unicode

    2019-05-20
    1
  • 古夜
    加了笑话更有料了

    作者回复: 😀

    2019-05-20
    1
  • 陈志恒
    1.原码表示法有一个很直观的缺点就是,0 可以用两个不同的编码来表示,1000 代表 0, 0000 也代表 0。
    2. 用补码来表示负数,使得我们的整数相加变得很容易,不需要做任何特殊处理,只是把它当成普通的二进制相加,就能得到正确的结果。
    3. 我们日常说的 Unicode,其实就是一个字符集,包含了 150 种语言的 14 万个不同的字符。
    4. 而字符编码则是对于字符集里的这些字符,怎么一一用二进制表示出来的一个字典。我们上面说的 Unicode,就可以用 UTF-8、UTF-16,乃至 UTF-32 来进行编码,存储成二进制
    5.烫的问题其实是编码和解码不一致的问题
    2019-11-28
  • 好饿早知道送外卖了

    一边学习一遍查阅资料发现个问题:

    文中这句是不是有些问题?
    `这就好比我们用 GB2312 这本密码本,去解密别人用 UTF-8 加密的信息,自然没办法读出有用的信息。`

    感觉`锟斤拷`并不是`UTF-8`与`GB2312`的转换导致吧?

    UTF-8与Unicode的转换本身都必须经历`Unicode`的转译
    GB2312--Unicode--UTF8

    所以`锟斤拷`实际上是源于GBK字符集和Unicode字符集之间的转换问题?
    感觉未知字符在从Unicode转译成GBK字符集的时候原本就会出现这个问题。

    以下是相关链接:
    https://baike.baidu.com/item/%E9%94%9F%E6%96%A4%E6%8B%B7
    https://blog.csdn.net/ZYY88886666/article/details/75285780
    2019-11-20
收起评论
41
返回
顶部