手摸手带你理解 进制 字节 ASCII码 Unicode 与 字节编码(UTF-8 /16)等(上)

首先要讲一个概念

计算机是使用 二进制 来存储数据 的

为什么是二进制 不是 十进制 八进制 十六进制呢

原因有很多 粗略列举几点

1.技术上容易实现
- 这个很容易理解 计算机的最底层无非就是一堆集成电路按照,各种规则做着各种各样的事情
- 对于 电路最简单有效的传达信息的方式自然是两种 通电 放电
- 所以 用 0 代表低平电 1 代表高平电
2.可靠性高 不易出错
-这个就更不用说了 就俩数字出错的可能性也较低
3.运算规则相较其他进制较为简单

4.与逻辑相近 可以用 0 代表 false 1 代表true 等等

当我们知道了 计算机是使用二进制 来编码的之后 需要明白一个概念

字节

我们规定一个二进制数占一个字元 , 而八个二进制数就是一个字节(我查阅了半天资料确实没找到 这是谁定的 但是有一点可以确定 那就是 这个概念出现的 ASCII 码要早的 ,为什么强调这个,后文会讲到,至少笔者认为 不是因为ASCII码 才规定的 一个字节 等于 八个字元 )

Bit,乃BInary digit(二进制数)位的缩写,
是数学家John Wilder Tukey提议的术语(可能是1946年提出,但有资料称1943年就提出了)。
这个术语第一次被正式使用,是在香农著名的《信息论》,
即《通信的数学理论》(A Mathematical Theory of Communication)论文之第1页中

ASCII

(American Standard Code for Information Interchange)即: 美国信息交换标准代码

看起来很高大上的词语,其实就是一种说话的方式.
可以想象的到计算机用 0 1 来表示信息,
那我们人又不知道 010101 是啥意思 机器自己也不知道这是啥意思,那我们想要真正利用起这个东西
就得给他定一个格式
比如说 :

			001 代表是 汉语中的 '我请', 
    		010 代表是 汉语中的 '你吃',
            100 代表是 汉语中的 '饭鸭'.
     		000 代表是一个字的结束

那 001000010000100 的意思就是 我请你吃饭鸭 机器码也是这个原理

一开始的时候 计算机的 编码十分混乱 世界存在不同地区的很多种字符集

(每一个符号字母都是字符 全都放一起就是字符集)

乱到什么程度呢?

继续拿上面举例子 可能 A区的人 用的是我们上面定义 的规则 而B地区的人 可能

B规则		001 代表  汉语中的 '我们',
			010 代表  汉语中的 '去上',
			100 代表  汉语中的 '坟吧'
			000 代表一个字结束 

遵守的是这样一套B规则 那么 有一天 A区的人要 跟B区的人用计算机交流一下
发出了这样一串码 001000010000100000 意思是: 我请你吃饭鸭
可是B区的人看到这个意思就是 我们去上坟吧 ,
这个时候B区的人肯定就很奇怪 好端端的上什么坟是吧 ,可是A区明明想表达的是 要请他吃饭啊
这可怎么办 白吃的饭不能不要啊

一直这样错下去也不行 那就商量商量我们都用一个编码吧!

那就各自都拿方案来 这个国家提一个那个国家提一个 其中就包含 这个ASCII

美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI
)制定的,是一种标准的单字节字符编码方案,用于基于文本的数据。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,后来它被国际标准化组织(International
Organization for Standardization, ISO)定为国际标准,称为ISO 10646标准

又是好大一串的术语 ,其实就是 ASCII码是美国造的 后来被成了国际标准 让大家都能够好好讲话!

我们来说说这个 ASCII 码是咋定的 其实跟我们上面定 的A 规则 B规则 没什么不同就是比较正经一点.

首先:
它规定 一个 符号占一个字节
我们上面已经讲过了 一个字节
等于八个字元 也就是八个二进制数

进制

二进制数是啥 我们日常使用的其实是
十进制 逢十进一
其实在十进制里是没有十这个数字的
十进制中 一个有十个数(0,1,2,3,4,5,6,7,8,9)
9的后面其实是 1 0 来跟着我读 一 零 它是进的一 只是我们方便读成了十

其实我们日常生活中为了方便 在说出某个数字的时候 就默认对方说的是十进制数字

而数字是数字 进制是进制

就比如 231(不要读二百三十一 读 二三一) 我们一般会认为它是十进制数字 是231(二百三十一)
实际上它也可能是一个 16位进制的 231 那它转化为 十进制就会 变成 561

不懂没关系 我们慢慢解释

为什么 231 的十进制的数字是 231 呢
我们在计算的时候要从最后一位开始计算
计算规则就是 ( 数字*进制^位数 + 数字*进制^位数
^ 代表平方
那么怎么看这个计算规则呢
比如 说 231 是十进制的 二百三十一
从右往左看 1 是第0位 ,3是 第 1 位 ,2是 第 2

所以 231 在十进制中的数字应该这么算 ( 数字*进制^位数 )

 (2*10^2)+ (3 * 10^1)+(1 * 10 ^ 0 )  = 231

所以 231(二三一) 在十进制 中是 231(二百三十一)

为什么 231(二三一) 作为十六位进制转化为 十进制就变成了 561呢

(2*16^2)+ (3 * 16^1)+(1 * 16 ^ 0)  = 512 + 48 + 1 = 561 

上面这种 把其他数字转换为十进制的方法 叫做 按权相加

至于十进制转换为其他进制 作为扩展就是 "除进制取余,逆序排列" ,感兴趣可以自己去了解

了解完进制 我们继续看ASCII码

它规定 一个 符号占一个字节
我们上面已经讲过了 一个字节
等于八个字元 也就是八个二进制数

一个字符有八个字元也就是 八个二进制数字
那我们来算一下 一个字符 最大能表示的十进制数字是多少
首先 2进制数字 是由 0 1 组成的 那么 最大的肯定是 1对吧?
那 八个 1 应该就是 一个字符能表达的最大的数字了
也就是 11111111

按照上面说的按权相加法 把它转换成 10进制数字试试

 (1*2^0)+(1*2^1)+(1*2^2)+(1*2^3)+(1*2^4)+(1*2^5)+(1*2^6)+(1*2^7)
=  1 + 2 + 4 + 8 + 16 + 32 + 64 + 128
=  255

也就是说 一个 字符最大表示的数字是 255
也就是能表示 0~255 ,一共 256个符号(0也是一个符号)

可是ASCII码最后一次更新 是在 1986年 到目前为止一共 收录了128个字符 还有一半没用呢

这是为啥呢?

因为实际上 虽然一个 ASCII 码字符占一字节 也就是 八位字元 但是实际上只用了7位 ,空出了最高位 用做奇偶校验 ,也不用管他干嘛的就是一种规则 来判断你这个数字对不对 毕竟后边 那么多的0 1呢,你说是吧?

要说这事儿吧, 也是 老美没有考虑周到 ,因为ASCII码一开始没定义多少个 ,他就觉得够用了,到后来发展越来越快 ,计算机的字符越来越多 ,各种语言啊,表情啊之类的字符 ,可是ASCII码只有 128位啊 , 那怎么办? 然后各国国家又开始研发自己的标准 来存自己的字符了,这可不行啊,于是下一个主角应运而生.

Unicode

下一章再讲

附下章链接 手摸手带你理解 进制 字节 ASCII码 Unicode 与 字节编码(UTF-8 /16)等(下)

发布了6 篇原创文章 · 获赞 6 · 访问量 174

猜你喜欢

转载自blog.csdn.net/qq_28223195/article/details/105152649