目录
2.1信息存储
1、程序类型
我们将程序称为“32位程序”或“64位程序时”,区别在于该程序是如何编译的,而不是其运行的机器类型。
Linux > gcc -m32 prog.c // 32位程序 可以在32位或者64位程序上运行
Linux > gcc -m64 prog.c // 64位程序 只能64位程序上运行
数据类型 int32_t 和 int64_t 分别为4个字节和8个字节。不随编译器和机器设置变化。
2、字节序
网络应用程序的代码编写必须遵守已建立的关于字节顺序的规划,以确保发送方机器将它的内部表示转换成网络标准,而接收方机器则将网络标准转换为它的内部表示。
文本数据是比二进制数据具有更强的平台独立性。二进制是经过编译得到的。不同机器、编译器可能具有不同编译规则。因此二进制代码是不兼容的,很少能在不同机器和操作系统之间移植。
3、C语言中位运算
|(或) &(与) ~(非)
4、C语言中逻辑运算
逻辑运算认为所有非零的参数都表示TRUE,而参数0表示False。
逻辑运算符&&和||与他们对应的位级运算&和|的另一个重要区别是,逻辑运算符如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值(意味着提前结束)。例如表达式 a&&5/a 将不会造成被零除,表达式 p&&*p++也不会导致间接引用空指针。
5、C语言中的移位运算
左移运算:对于一个位表示为的操作数 x,x << k 会生成一个指,其位表达式为
。也就是说将x右边的w-k位向左移动k位,丢弃最高的k位,并在右端补k个0.
例如:操作数 x 位表达式为 01010101,x << 3 将得到 10101000。
右移运算:所有的左移操作都是一样的,然而右移运算 x >> k 分为逻辑右移和算术右移。逻辑右移与左移相似,在左端补 k 个0,得到的结果是。而算术右移是在左端补k个操作数 x 最高有效位的值,得到的结果是
。
例如:操作数 x 位表达式为 00110101, x >> 3(逻辑右移) 将得到 00000110。
操作数 x 位表达式为 00110101, x >> 3(算术右移) 将得到 00000110。
操作数 x 位表达式为 00110101, x >> 3(算术右移) 将得到 111001110。
几乎所有的编译器/机器组合都对有符号数使用算术右移。而对于无符号数右移必须是逻辑的。
下面再给出一个例子:
其中斜体的数字表示最右端(左移)或最左端(右移)填充的值。
2.2整数表示
1、无符号数编码
数值范围 0 ~ -1。介于0 ~
-1之间的数都有唯一一个w位的值编码。w位无符号值范围为0~
。其中
2、补码编码
最高有效位 也称为符号位,它的权重为
,是无符号表示中权重的负数。
w位补码能表示的值的范围为~
。其中
,
可以看出补码的值范围是不对称的:
最大无符号数值刚好比补码最大值的两倍大一:
3、补码转为无符号数
4、无符号数转补码
5、有符号数数与无符号数的运算
要创建一个无符号常量,必须加上后缀字符‘U’或‘u’,例如12345U或者0x1A2Bu。
由于C语言同时包含有符号和无符号表达式,出现了一些奇特的行为。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式的将有符号参数强制转换为无符号数。因此对于像<和>这样的关系运算符来说,会导致非直观的结果。
6、拓展数字位表示
无符号拓展位在前面添加0 ,有符号拓展位在前面添加最高有效位的值。
7、截断数字
截断无符号数
截断补码数值
2.3整数运算
1、加法
无符号加法
补码加法
2、求反
无符号数求反
补码的非
执行补码非的另一种方式是对每一位求补,再对结果加1。-x=~x+1
3、乘法
无符号乘法
补码乘法
无符号和补码乘法具有位级等价性
相同的位向量表示的数相乘,无论是无符号还是补码形式,得到的结果截断后位级表示都相同。
4、乘以常数
在大多数机器上,由于乘法指令比较慢,需要更多的时钟周期。编译器会进行一项优化,试者用移位和加法运算的组合来代替乘以常数因子的乘法。例如 x*14 编译器会将乘法重写为 (x<<3)+(x<<2)+(x<<1)。
5、除以2的幂
整数除法比整数乘法更慢。除以2的幂也可以用移位运算来实现。无符号和补码数分别使用逻辑移位和算术移位来达到目的。
2.4浮点数
1、二进制小数
例如
二进制小数只能表示那些能够写出的数,其他的值只能被近似的表示,增加二进制长度可以提高表示的精度。
2、IEEE浮点表示
C语言中浮点数包括单精度和双精度,分别用32位和64位表示。
根据exp的值,被编码的值分为三种不同的情况:非规格化值、规格化值、特殊值。
规格化值:exp不全为0 也不全为1。
非规格化值:exp全为0
特殊值:exp全为1
假定8位浮点格式的示例
3、舍入
4、浮点运算
浮点运算不满足结合律和分配律