数值编码
编码是用文字、符号或者数码来表示某种信息的过程。对数值来说,主要有两种编码方式:定点格式和浮点格式。(现实中真实的数值被称为真值。)
定点整数
小数点固定在数的最低位之后(最右侧),称其为定点整数。如果在最高位(最左侧)就是定点小数。
定点整数不考虑正负,只表示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码及其字符表如下所示:
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编