目录
1.补码思考
=> 负数的补码等于 符号位不变,其余位取反加1。
如果不管符号位,只分析数值位: 显然,其余位取反,意味着两数相加的二进制表示为 全1,即 111 1111 => 2^7-1 = 127。
又因为数据是从0开始的,所以是 0~127 共128个数。
模长的含义是能代表多少不同的状态 (自我理解 ),所以这也是为什么补码的转换规则是 "其余位取反加1" 。
"-x " = "+ (模长 - x) " 其中 x 表示的是正数 ;
以时钟为例,假设现在指向9点,如果想知道三个小时前是几点,怎么求解? 易知,时钟的模长为12。
一种是 9 - 3 = 6 ; 还有一种是 9 + (12-3) = 18 然后 18 / 12 商1余6, 余数6便是答案。
而这个取余操作,在计算机的运算中体现为进位,然后由于字长限制,进位会溢出(即丢弃), 所以内存中的二进制码直接得出正解
例: r = FEH,计算 r 的真值。(机器字长为8位)
r 的二进制表示为 1 111 1110 仅考虑数值位,分析知:数值位为 7*16 + 14 = 126。 对于7位二进制,模长为 2^7 = 128,所以很容易知道求补码之前 为 2,再将符号位考虑进去,则 r = FEH 表示的真值为 -2。
尽管这样分析画蛇添足,因为直接二进制根据补码规则求原码很容易得出: 1111 1110 => 1000 0010 ==> -2
但是一波操作下来,基础可以更扎实,而且有的题型用这个速度快。
2. 计算思考
unsigned short x = 65530; (其中 short 类型占 16位,即2字节) 则 x 的二进制表示为:
无符号数 => 全部是数值位,所以 1111 1111 1111 1111 大小为 2^16-1 = 65535 。
65535 - 65530 = 5 二进制表示为 101 所以 65530 表示为 1111 1111 1111 1010 (符号扩展再相减)
这里注意:
0100 0000 真值为 2^6 = 64 (次方是从0开始的,也可以直接理解为后面几个零就几次方)
0111 1111 真值为 2^7 - 1 = 127 (这里则是数学运算处理的一个技巧:先+1,导致进位然后减1)
3. 习题笔记
【1】8421 码就是二进制数 (x)
==> 8421码是十进制数的编码
【2】模4补码和模2补码不同,它更容易检查乘除运算中的溢出问题。 (x)
==> 模4补码具有模2补码的全部优点,且更容易检查加减运算中的溢出问题。
【3】模4补码,在算术和逻辑部件中为一个符号位 (x)
==> 只有在将两个 模4补码的数送往 ALU 完成加减运算时,才把每个数的符号位的值 同时送到 ALU 的双符号位中,
即只在 ALU 中采用双符号位。
【4】易知:[x]补 ==> [-x]补 规则是: 连同符号位在内 所有位取反加 1。
机器字长为8位时,当 x= -128 ,明显将发生溢出错误。移码同理,二者表示范围均为 -128 ~ 127 。
【5】若 [x]补 = X0 X1 X2 ……Xn,X0 为符号位,X1 为最高数位,哪种情况当补码左移时,将会发生溢出。
==> 如果是用原码表示,那就很容易判断了。因为符号位不用考虑,只要数值位最高位为1,左移一定发生溢出。
( 原码 = 符号位+ 数绝对值),符号位为0,代表上溢出;符号位为1,代表下溢出。
这里用补码表示,转为原码就解决问题了。对正数,原码补码同,所以 X0=0, X1=1时发生溢出;对负数,符号位 X0=1
原码为1 对应补码则为0,所以此时 X1=0 , 综上: X0 !=X1 时将发生溢出。
==> 当然也可以采用补码表示下 的 双符号位移位判别法 以及 一位符号位和最高数据位进位情况判断。
双符号位移位判别法: 高位符号位代表真正的符号,低位符号位参与移位。当 双符号位 为 01 或 10 的时候溢出。
==> 如果不考虑溢出,算术左移一位有乘2效果,右移一位有除以2效果,这是在字长没有限制情况下,如果机器字长有限,则 必须考虑溢出情况。
【6】某字长为8位的计算机中,已知整型变量 x,y 的机器数分别为 [x]补= 1111 0100 [y]补=1011 0000 若整型变量 z=2*x + y/2
则 z 的机器数为:1100 0000
思路:<1> 先把 x 和 y 的补码化成真值,做加减运算后再化为补码形式。
<2> 直接移位运算实现 乘除运算,然后直接补码形式相加。(而且判断溢出也很方便)
【7】 C语言代码: unsigned short usi = 65535; short si = usi; 执行上述程序后, si 的值是
==> 一顿操作, 1111 1111 1111 1111 符号位1 数值位 111 1111 1111 1111 值为 (usi+1) /2 -1 = 32767 所以结果为 -32765 。但是正确答案是: -1
解析:1111 1111 1111 1111 保存到内存中,因为是无符号数( >= 0),计算机解读的是 全部是数值位,值为 65535 没问题。
但是强制类型转换后, 有符号数 1111 1111 1111 1111 保存在内存中,而 C语言的数据在内存中为补码形式,所以计算机
解读方式发生了改变,在转换为真值时,按补码转换规则来计算。 "点我 "
【8】在计算机中,通常用来表示主存地址的是:无符号数
因为主存地址都是正数!
4. 乘除法中的考题