文章目录
上接 (实验一)十进制整数的原反补移码实现
1. 实验要求
用C/C++编程实现输入一个带符号十进制数,显示其原、反、补三种机器数左、右移2位的结果
2. 相关知识点
机器字长全部假设为 8 位,只讨论整数,后不再特殊说明
0. 移位运算
对于带符号数的移位运算,符号位不变,只改变数值位,移位又分为左移和右移,左移一位相当于该数乘以 2,右移一位相当于该数除以 2
1. 原码移位
对于正数:左移或右移,符号位不变,数值位中,移出位丢弃,空出位补 “0”
对于负数:左移或右移,符号位不变,数值位中,移出位丢弃,空出位补 “0”
总结:甭管正负,补 “0” 就对了
例子:X = [11010110] 原 _原 原 左移 1 位的结果是 2X = [10101100] 原 _原 原(丢了符号位后面的 1,最后面补了个 0),右移 1 位的结果是 1 2 \frac{1}{2} 21X = [10101011] 原 _原 原(丢了最后面的 0,符号位后面补了 0)
2. 反码移位
对于正数:左移或右移,符号位不变,数值位中,移出位丢弃,空出位补"0"([X] 反 _反 反 = [X] 原 _原 原嘛,原码补"0"我反码也补"0")
对于负数:左移或右移,符号位不变,数值位中,移出位丢弃,空出位补"1"(既然原码负数都补"0",造反的反码肯定都补"1")
总结:正补"0"负补"1"
例子:X = [11010110] 反 _反 反 左移 1 位的结果是 2X = [10101101] 反 _反 反(丢了符号位后面的 1,最后面补了个 1),右移 1 位的结果是 1 2 \frac{1}{2} 21X = [11101011] 反 _反 反(丢了最后面的 0,符号位后面补了 1)
3. 补码移位
正负数由符号位决定,如 X = -0,[X] 补 _补 补 = 00000000,我们也把它当正数(嗯数(字)奸(细))
对于正数:左移或右移,符号位不变,数值位中,移出位丢弃,空出位补"1"([X] 反 _反 反 = [X] 补 _补 补嘛,原码补"0"我补码也补"0")
(还记得补码和原码的关系吗,当 X < 0,[X] 补 _补 补 = [X] 原 _原 原 自低位向高位,尾数的第一个 1 及其右边的 0 保持不变,左位的各位取反)
对于负数:当左移时,符号位不变,数值位中,空出位在最右边,肯定算在最低位中,补"0"妥妥的,当右移时,符号位不变,空出位在(除符