加减法运算
所有的加法运算在内存中的运算都遵循二进制的计算法则,只不过因为相同二进制表示在不同整数类型下表示的数不同,运算法则也有所不同。
无符号加法
计算规则
可以将无符号数的加法视作是一种模运算,在二进制表示中丢弃掉溢出的位的操作就等同于该数mod 2w-1,任何权重大于 2w-1的位只需简单舍弃即可。
推导:将权重大于等于2w的位舍去(实际上只可能有1种舍去的情况,也就是舍弃第w位的“1”)。
检验方法
对于任意的x和y,只要二者相加的结果小于任何一个被加数,则出现了溢出。
证明:因为对于任意x和y,有0<=x,y<2w,则产生溢出后x-2w的值一定小于0,也就是说y相当于减去了一个数,自然会比y本身小。
无符号求反(减法)
原理是用2w对2w取模后为0.
补码加法
计算规则
检验方法
当且仅当,两个正数相加后出现了负数或两个负数相加出现了正数,分别出现了正溢出/负溢出.
证明:当两个正数相加出现正溢出时,得到的结果一定是个负数;当两个负数相加出现负溢出时,得到的结果一定是个正数;当正数与负数相加时,不会出现溢出。
补码取非
基本原理
由于补码可同时表示正数和负数,所以绝大多数(实际上只有一个数不满足)补码数的取反就是它的负数;但由于补码正负数取值范围的不对称性,需要特殊考虑最小的负数。
补码非的位级表示
1.对每一位求补,再对结果+1即可得到非,即:-x=~x+1
2.对二进制表示最右边的”1“的左边所有位进行求补,即可得到非。
可以证明,这两种方法完全等价。
乘法运算
无符号乘法和补码乘法
无符号数乘法(原理与无符号加法大致相同):
补码乘法:
也就是说,无符号乘法和补码乘法具有相同的位级表示,只不过解读相同的二进制表示时的手段不同,无符号乘法和补码乘法具有位级等价性。
计算机中乘法的计算方式
在计算机中,乘法运算比移位运算、加法运算的代价要大得多,在计算乘法时,将其表示为移位运算和加法运算之和。
乘以2的k次方相当于左移位k位。
例:
计算机在计算乘法使用哪种方式与机器密切相关,取决于指令的相对速度。
除法运算
我们只讨论除于2的幂,因为除以2的幂并不能像乘法一样推广到除以任意常数。
无符号除法:逻辑右移
补码除法1:算术右移(向下舍入)
补码除法2:引入偏置值(向上舍入)
当执行算术移位时,有:
ps:C语言一般执行向零舍入,也就是正数执行算术右移,负数需引入偏置值向零舍入。
标签:CSAPP,正数,运算,补码,负数,2w,第二章,乘法 From: https://www.cnblogs.com/zekang666/p/18001671