04、计算机基础--编码

数值编码

编码是用文字、符号或者数码来表示某种信息的过程。对数值来说,主要有两种编码方式:定点格式和浮点格式。(现实中真实的数值被称为真值。)

定点整数

小数点固定在数的最低位之后(最右侧),称其为定点整数。如果在最高位(最左侧)就是定点小数。

04、计算机基础--编码

定点整数不考虑正负,只表示0和正整数的话,就是无符号整数。

N位二进制共有\(2^N\)个编码,表达真值:0 ~ \(2^N - 1\) 。

如16位和32位二进制所能表示的无符号整数范围是:0 ~ \(2^{16} - 1\)和0 ~ \(2^{32} - 1\)

通常机器数的最高位(最左侧)称为符号位,用0表示正数、1表示负数,这就是有符号整数。

原码、反码、补码

计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 。

原码:是一种计算机对数字的二进制定点表示方法。原码不能直接参与运算,会出错。
反码:正数的反码和原码相同,负数的反码是对正数逐位取反,符号位保持为1(负数)。
补码:正整数的补码是其二进制表示,与原码相同。负数的补码是将除符号位外所有位取反加1.

在原码中计算出错,是因为数学问题。

例如:在数学上1 + (-1) = 0,将其换算成二进制原码的表现形式如下:

00000001+10000001=10000010 转换10进制为-2,所以错误。

所以,在计算机系统中,数值一律用补码来表示和存储。因为补码可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。

在补码中,负数补码是将对应正数补码取反(即将0变为1,1变为0)再加1形成。

例如:正整数105,用8位补码表示:

\([105]_{补码}\) = 01101001B

负整数-105,用8位补码表示:

\([-105]_{补码}\) = \([01101001B]_{取反}\) + 1 = 10010110B + 1 = 10010111B

所以,补码就是用来解决负数在计算机中的表示问题。

最后总结如下:

对于正数来说:补码 = 原码 = 反码
对于负数来说:补码 = 原码的反码 + 1

字符的编码

在计算机中,字符需要用若干位二进制码的组合表示,即字符的二进制编码。由于字节为计算机的基本存储单位,所以通常8个二进制为单位表达字符。

一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。

字节和字符

字节和字符的转换根据语言和编码的不同,它们的转换关系也有区别:

ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
Unicode 编码中,一个英文为一个字节,一个中文为两个字节。

ASCII码

ASCII码是一种非常常用的编码,标准ASCII码用7位二进制编码,故有128个。而计算机的存储单位为8位,所以表达ASCII码时最高D&位通常为0;通信时,D7位通常用作奇偶校验位。

奇偶校验(Parity Check)是一种校验代码传输正确性的方法。

其中标准ASCII码及其字符表如下所示:

04、计算机基础--编码

ASCII码表中的前32个和最后一个编码是不可显示的控制字符,用于表示某种操作。

从20H开始(含20H)的95个编码是可显示和打印的字符,其中包括数码、英文字母、标点符号等。

数字0~9的ASCII码为30H~39H,去掉高4位(或者说减去30H)就是BCD码。

其中大写字母和小写字母之间相差20H(32),所以大小写字母非常容易互相转换。

Unicode

ASCII码表达了英文字符,但却无法表达世界上所有语言的字符.

Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论是什么语言

Unicode使用16位编码,能够对世界上所有语言的大多数字符进行编码,并提供了扩展能力。Unicode作为ASCII码的超集,保持了与其兼容。

Unicode的前256个字符对应ASCII字符,16位编码的高字节为0、低字节等于ASCII码值。

例如:大写字母A的ASCII码值是41H,用Unicode编

上一篇:BASE64编码


下一篇:LINUX处理GBK编码(C语言)