组原2_第二章练习思考

目录

1.补码思考

2. 计算思考

3. 习题笔记

4. 乘除法中的考题


 

 

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. 乘除法中的考题

 

 

 

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值