深入理解计算机系统[习题]_第二章_信息的表示和处理

题目1

在这里插入图片描述
[可以看到这个练习中,从 [ 1011 ] 扩展到 [ 11011 ] 再扩展到 [ 111011 ] ,它们都是 -5 的补码表示。可见有符号数位扩展时候,左边扩展符号位,不会对它的数值有影响。]
[而且也验证了,对于无符号数来说,每一个数只有一种位向量表示,而对于有符号数(补码表示),同样都是-5,就有很多种表示,甚至是无限种,只要扩展符号位就可以。 -2019/5/6]

题目2

在这里插入图片描述
在这里插入图片描述

题目3

在这里插入图片描述
A: 当 s 比 t 短的时候,该函数会返回1
B:由于 strlen 被定义为产生一个无符号的结果,差和比较都采用无符号运算来计算。当 s 比 t 短的时候,strlen(s) - strlen(t)的差会为负,但是变成了一个很大的无符号数,大于0。
C:改为 return strlen(s) > strlen(t);

[ 举个负数变成了很大的无符号数的例子: 3 - 4 ===> [0011] - [0100] = [1111] ,这个[1111] 视为有符号数(补码),则为-1,结果正确了;视为无符号数,则为15,结果就错了。]

题目4

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目中的dw_loop指的是深入理解计算机系统一书第二章的练习题2.60: ``` /* 将整x中从第i位开始的n个(二进制)位求反 */ int loop(int x, int i, int n) { int mask = (~(~0<<n))<<i; return x^mask; } ``` 这个题目的主要难点在于理解掩码的概念以及如何对掩码进行构造。 首先应该明确的是,掩码(mask)是一种用于选取特定位的位模式。在这个题目中,我们需要选取从第i位开始的n个位,然后将它们求反。因为掩码是从i位开始,长度为n,所以可以构造掩码的二进制表示如下: ``` 0000...0111...1000... (i位) (i+n位) ``` 其中,从第i位到第i+n-1位的二进制表示全部为1,而其他位为0。构造这个二进制表示的方法是,先将所有位都设置为1,再将前i位和从i+n位开始的所有位都取反。 对于掩码的二进制表示,可以使用位运算符<<和>>来进行位移操作。具体地,对于一个长度为w的二进制,左移n位相当于将这个乘以2^n,右移n位相当于将这个除以2^n。 在这个题目中,由于掩码需要从第i位开始,因此我们需要先将其左移i位。同时,因为掩码的长度为n,我们还需要将它右移w-n位,将高位置为0。这样就可以得到掩码的完整初始值: ``` (~(~0<<n))<<i ``` 其中,~表示按位取反,<<表示左移,预定义的常量~0表示所有位都为1的二进制。按位取反之后~0的二进制表示形式就变成了所有位都是0,左移n位后为: ``` 0000...0111...1000... (i位) (i+n位) ``` 最后,将这个掩码与原始据进行异或运算,就可以将指定的二进制位求反。 对于这个题目,个人认为,它主要考察的是对位运算符的理解和运用,以及对掩码的构建和运用的理解。而且,掩码和位运算符在很多计算机系统的底层实现中都扮演着非常重要的角色。因此,这个题目的重要性不容小觑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值