专栏首页前端之旅深入理解计算机系统cp1:存储单位、数制、编码

深入理解计算机系统cp1:存储单位、数制、编码

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 定义

数制也叫进制/进位制,是人们规定的一种进位方法。对于任何一种进制 —— X 进制,就表示某一位置上的数运算时是逢 X 进一位。比如,十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x 进制就是逢 x 进位。

2.2 常见制和相关概念

进位制

二进制

八进制

十进制

十六进制

进位规则

逢二进一

逢八进一

逢十进一

逢十六进一

基数

2

8

10

16

数码

0,1

0,1…7

0,1…9

0,1…9,A…F

位权

2^i

8^i

10^i

16^i

前缀

0b

0o

0x

后缀

B

O

D

H

例如,16进制数101可以表示为101H、(101)下标16,或者0x101。

2.3 数制之间的对应关系

2.4 数制之间的转换

  • x 转十: 按权展开求和,比如二进制101对应十进制是1x2²+0x2¹+1x2º
  • 十转 x:
    • 整数部分,除X取余,倒序;
    • 小数部分,乘X取整,正序。
  • 二转八/十六: 以小数点为界,分别向左向右分成三位一组,不够三位补0,分组后对应成八进制数;二转十六同理,只是四位一组。
  • 八/十六转二: 每一位八进制数转化为对应的三位二进制数;十六转二同理,只是四位二进制数。

PS:八进制和十六进制之间不能直接转换,八进制需要先转成二进制或十进制,在由对应的二进制或十进制转成十六进制,反过来也一样。

3.编码

3.1 数字编码

数字编码在深入理解计算机系统cp2:定点数的表示和运算中再进行详细介绍。

3.2 BCD码

3.2.1 什么是 BCD码?

用四位二进制数来表示一位十进制数,称为二–十进制编码,简称 BCD(Binary Coded Decimal)码。

3.2.2 为什么需要 BCD码?

BCD 码其实是为了处理十进制转化为二进制的问题而存在的。 前面我们介绍了二进制与十进制之间的转换,但这种转换对计算密集型应用友好,对输入/输出密集型应用则不友好 —— 因此设计了 BCD码。拿 8421BCD码 举例,它将 0~9 一一映射为一个四位二进制数,从而做到快捷转换。比如, 321 的 8421BCD码 直接就是 0011 0010 0001,而无需再想之前那样乘2取余的麻烦运算。

3.2.3 8421BCD码

BCD码有很多,比如 8421BCD码,余三码等,这里我们只讲第一种。具体的对应关系如下:

注意:8421BCD码 只有 0000~1001 共十个,而 1010、1011…等等不是8421BCD码。

3.3 字符编码

3.3.1 为什么需要字符编码?

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

3.3.2 编码规则的演变

  • ASCII: 1) /ˈæski/,即 American Standard Code for Information Interchange,美国信息交换标准代码。本来一个字节有8位,每一位有0和1两种状态,则一个字节共有2^8=256种状态,可以表示256种字符。但是美国佬比较自私,觉得只要可以表示自己的字母和一些特殊字符就足够了,所以 ASCII 没有占用最高位(而是固定为0),实际只用到了后面7位,它可以表示 2^7=128 种状态,也就是表示128个字符。 2) 很显然,这用来表示字母是足够的,但要想表示其它语言的字符,128还是太少了。 PS:附送 ASCII 对照表一张:
  • GB2312: 1) 既然美国佬只解决了字母和特殊符号的编码问题,那么我们中国人只好实现自己的编码,从而来表示汉字了。所以这时候出现了 GB2312 编码(国标码)。 2) 问题:不幸的是,各个国家都是这么想的,所以小日本有了 Shift_JIS 编码,棒子有了 Euc-kr 编码…..一时之间各国都有了自己的标准,那么对于一个多语言混合的文本来说,存在着不同的编码规则,最终必然导致乱码。
  • 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

参考: https://segmentfault.com/a/1190000005936800 https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 大数据ETL实践探索(8)---- 数据清洗的目的,方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1539362
  • MySQL时间函数的选择

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    bisal
  • Windows使用ROS机器人操作系统教程说明

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    zhangrelay
  • 如何将 Redis 用于微服务通信的事件存储

    原文链接:https://www.xttblog.com

    业余草
  • 数据库连接池配置参考

    其实对这种和数据库交互的应用,现在的程序中,大多都用了数据库连接池,无论用的开源,还是自研的,无非都是想通过连接池,更方便、更高效地和数据库交互,因此一定程度上...

    bisal
  • 树莓派4上跑 .NET Core 3.0,这次,真·64位!

    前不久我写了一篇《在树莓派4上安装 .NET Core 3.0 运行时及 SDK》,以及后续《“自启动”树莓派上的 .NET Core 3.0 环境》、《Ngi...

    Edi Wang
  • ROS2网络多机通信DDS和安全加密SROS(多机器人系统)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    zhangrelay
  • 什么?你还不知道 e.printStackTrace() 会导致锁死?

    原文链接:https://my.oschina.net/sxgkwei/blog/825700

    业余草
  • 写给.NET开发者看的Python3上手指南系列(1):Python3与C# 基础语法对比

    由于 Python 在数据科学和机器学习、深度学习中有广泛应用,作为.NET开发者,大家将来或许需要将 Python 构建的项迁移到 ML.NET或Tensor...

    Enjoy233
  • 微信小程序 wxs 使用正则替换字符串

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    叉叉敌

扫码关注云+社区

领取腾讯云代金券