Computer Systems: A Programmer's 第二章信息的表示和处理 总结
无符号整数编码 B2Uw
B2U4([0001]) = 0*2^3+0*2^2+0*2^1+1*2^0 = 1
B2U4([0101]) = 0*2^3+1*2^2+0*2^1+1*2^0 = 5
B2U4([1011]) = 1*2^3+0*2^2+1*2^1+1*2^0 = 11
B2U4([1111]) = 1*2^3+1*2^2+1*2^1+1*2^0 = 15
补码编码 B2Tw 最高有效位(X(w-1) )为符号位
B2T4([0001]) = 0*2^3+0*2^2+0*2^1+1*2^0 = 1
B2T4([0101]) = 0*2^3+1*2^2+0*2^1+1*2^0 = 5
B2T4([1011]) = -1*2^3+0*2^2+1*2^1+1*2^0 = -5
B2T4([1111]) = -1*2^3+1*2^2+1*2^1+1*2^0 = -1
反码函数B2Ow
原码函数B2Sw
UMAXw 无符号 w 最大表示 2^w -1
TMINw 有符号 w 最小值 -2^(w-1)
TMAXw 有符号 w 最大值 2^(w-1)-1
有符号数和无符号数之间的转换(C语言中 无符号和无符号的运算 保持位不变)
从无符号数到补码的转换 U2T(u) "定义1、u-2^w , u ≥ 2^(w-1) 2、u , u<2^(w-1)" 把大于2^(w-1) -1 的数字转换为负值
从补码到无符号数的转换 函数T2U(x) "定义1、x+2^w , x<0 2、x , x ≥ 0" 将负数转换为大的正数
扩展一个数字的位表示
B2Tw+k([Xw-1,...,Xw-1,Xw-2,Xw-3,..X0]) = B2Tw([Xw-1,Xw-2,Xw-3,..X0])
B2T5[11101] = B2T3[101] 这就是扩展位等式 无符号扩展前面添加0 有符号扩展前面添加第一位数字
截断数字 k 代表要截断到第几位 例如 4位截断到3位 k = 3
无符号数截断 -> B2Uk([ Xk-1,Xk-2,Xk-3,..X0]) = B2Uw([Xw-1,Xw-2,Xw-3,..X0]) mod 2^k
补码数截断 -> B2Tk ([Xk-1,Xk-2,Xk-3,..X0]) = U2Tk( B2Uw([Xw-1,Xw-2,Xw-3,..X0]) mod 2^k )
无符号加法
无符号加法逆元
补码加法
补码的非
补码非计算,另外几种聪明的方法
1、计算一个位级表示的值的补码非有几种聪明的方法。这些技术很有用(例如当你在调试程序的时候遇到值0xfffffffa),同时它们也能够让你更了解补码表示的本质。
行位级补码非的第一种方法是对每一位求补,再对结果加1。在C语言中,我们可以确定,对于任意整数值x,计算表达式-x和~x + 1得到的结果完全一样。
下面是一些字长为4的示例:![]()
从前面的例子我们知道0xf的补是0x0,而0xa的补是0x5,因而0xfffffffa是-6的补码表示。
2、 x ≠ 0 , x的二进制格式,取最右边1的位置为k,我们对k左边的所有位取反,k右边的保持不变
例 我们用一些 4位数字来说明这个方法,这里用斜体来突出最右边的模式1,0,。。。。,0:![]()
无符号乘法
例: 5 = [0101] , 10 = [1010]; w=4位
5 * 10 = 50 mod 2^4 = 2
50的二进制[110010]截取到4位 就等于[0010]
补码乘法
举例说明,对于每一对位级运算数,我们执行无符号和补码乘法,得到6位的乘积,然后再把这些乘积截断到3位。
无符号的截断后的乘积总是等于x · y mod 8。
虽然无符号和补码两种乘法乘积的6位表示不同,但是截断后的乘积的位级表示都相同。
二进制小数
十进制小数→→→→→二进制小数 方法:“乘2取整”
对十进制小数乘2得到的整数部分和小数部分整数部分直接计算为二进制(bcd,除余法都行),剩下的小数部分用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分.
如此不断重复,直到小数部分为0或达到精度要求为止.第一次所得到为最高位,最后一次得到为最低位
如:0.25转换为二进制小数
0.25*2=0.5 取整是0
0.5*2=1.0 取整是1
即0.25 转换为 二进制为 0.01 ( 第一次所得到为最高位,最后一次得到为最低位)
3.8125转换为二进制小数
先转换整数部分 3 对应二进制代码 11 在转换小数部分
0.8125*2=1.625 取整是1
0.625*2=1.25 取整是1
0.25*2=0.5 取整是0
0.5*2=1.0 取整是1
即0.8125的二进制是0.1101(第一次所得到为最高位,最后一次得到为最低位)组合整数部分得到最终为11.1101
二进制小数->->->->->十进制小数
按照下图数列可以得出:二进制小数整数部分对应常规转换,小数部分乘.后面位取幂
整数部分为5
小数部分为 3/4 = 0.75 最后得到结果为 5.75
转换步奏:
1、先计算分数得到位(分母)从“ . ”右边开始数按照2的1次方计算 对应幂分别是 2.4.6.8.....
2、在正常转换为十进制数 也就是 从“ . ”右边开始数按照2的0次方计算 对应幂分别是 1.2.4.6......
3、最后除以 (分母)得到小数位,组合整数位 就是最终结果
十进制小数→→→→→八进制小数 方法:“乘8取整” 例如:
0.71875)10 =(0.56)8
0.71875*8=5.75 取整5
0.75*8=6.0 取整6
即0.56
十进制小数→→→→→十六进制小数方法:“乘16取整”例如:
(0.142578125)10=(0.248)16
0.142578125*16=2.28125 取整2
0.28125*16=4.5 取整4
0.5*16=8.0 取整8
即0.248
浙公网安备 33010602011771号