现代计算机存储和处理信息以二值信号表示,二值信号能够很容易地被表示、存储和传输。例如穿孔卡片上有洞或无洞、电压的高低或顺时针、及顺时针或逆时针的磁场。
图 二进制与电压的关系
1 二进制
大多数计算机使用8位作为一个字节,是最小的可寻址的内存单位。一个字节的值域是00000002 ~ 111111112。如果看出十进制整数,它的值域是010~25510。
这两种方式的表示方法都不合适:二进制表示法太冗长,十进制表示法与位模式的互相转换很麻烦。
1.1 十六进制
十六进制(简写为”hex”)使用 ‘0’~‘9’及 ‘A’~‘F’来表示16个可能的值。
十进制 | 0 | 3 | 17 | 29 | 162 |
二进制 | 0000 0000 | 0000 0011 | 0001 0001 | 0001 1101 | 1010 0010 |
十六进制 | 00 | 03 | 11 | 1d | a2 |
表 十进制、二进制与十六进制的表示
在大部分开发语言中,以0x或0X开头的数字常量被认为是十六进制的值。
1.2寻址和字节顺序
对于跨越多字节的程序对象,必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。
图 一个int类型对象在内存中的存储形式
一个类型为int的变量的大小为4个字节。其地址是0x50。这个变量的四个字节存储在0x50,0x51,0x52,0x53这四个位置中。
1.2.1 大端法与小端法
大端法:按最高有效字节到最低有效字节的顺序存储;
小端法:按最低有效字节到最高有效字节的顺序存储;
大小端法没有优劣之分,不同厂商在选择字节排序顺序时选择了不同的规则。
图 值为0x01234567的int类型大小端法存储方式
1.3 掩码
掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。将源码与掩码经过按位运算或逻辑运算得出新的操作数。
例如将ASCII码中的大写字母改作小写字母。A的码值位65(0100 0001),a的码值为97(0110 0001)。将A 转化为小写,只需将A的码值与(0010 000)进行或运算。
2 整数表示
用位来编码整数有两种不同的方式:一种只能表示非负数(无符号数),而另一种能够表示负数、零和正数。
表 整数的数据与算术操作术语。小标w表示数据中的位数
假设有一个整数数据类型有w位,我们将位向量写成,表示整个向量,或者写成[xw-1,xw-2,...,x0],表示向量中的每一位。
2.1 无符号与补码的编码
2.1.1 无符号数编码
2.1.2 补码编码
2.2 补码扩展一个数字的位
2.3 补码截断一个数字的位
3 整数运算
3.1 补码的非
3.1.1 -x = ~x + 1
这个规律在计算十六进制是哪个数的补码时非常有帮助,比如计算0xab是哪个数的补码。
X = [1010 1011] ~X = [0101 0100]
-X = ~X + 1 = [0101 0100] + 1 = [0101 0101]= 85
所以 0xab 是 -85的补码。