《深入理解计算机系统》 练习题2.31答案

你的同事对你补码加法溢出条件的分析有些不耐烦了,他给出了一个函数tadd_ok的实现,如下:

//determin whether arguments can be added without overflow
//WARNING: THIS code is buggy
int tadd_ok(int x, int y) {
    int sum = x+y;
    return (sum-x == y)&& (sum-y == x); }

你看了代码以后笑了,为什么?

错误原因

这个代码看似可以用来检测int型变量的溢出(如果是两个都是负数,那么可能会负溢出,否则可能正溢出),实际上就算溢出了,这个函数也会返回1。因为这个函数想要的是,如果发生溢出,就返回0。
所以你会笑==

推导

原理:sum-x与y是恒相等的。

添加假设:int型内部是4位二进制。即int型的表示范围为 − 2 w − 1 − 2 w − 1 − 1 -2^{w-1} - 2^{w-1}-1 2w12w11。w为4。
补码形式的各个二进制的权值如下:

第4位第3位第2位第1位
− 2 3 -2^3 23 2 2 2^2 22 2 1 2^1 21 2 0 2^0 20

推导
1)如果没有溢出,那么显然sum-x与y相等。

2)如果发生正溢出,那么最终的值sum为x+y-16。因为正溢出时,两个正数相加入侵到了符号位,本来希望符号位代表 + 2 3 +2^3 +23的值,但是由于这个1在符号位,所以代表的是 − 2 3 -2^3 23的值。这一来二去,这就比应该的值少了两个 2 3 2^3 23即16。所以就有了sum=x+y-16。但由于16是4位bit int类型的同余数,加减任何整数倍的16都会被截断,都相当于没有加减,所以:

  • sum=x+y-16
  • sum=x+y

3)如果发生负溢出,推导过程类似。

PS:感谢评论区热心网友的指出。

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要安装glibc 2.31,您可以按照以下步骤进行操作: 1. 首先,您需要下载glibc 2.31的压缩文件。您可以使用wget命令从镜像站点下载文件。例如:$ wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.31.tar.gz 2. 下载完成后,您需要解压缩该文件。您可以使用tar命令进行解压缩。例如:$ tar -zxf glibc-2.31.tar.gz 3. 进入解压缩后的glibc-2.31目录。例如:$ cd glibc-2.31/ 4. 您可以查看INSTALL文件中有关新版本glibc的信息。您可以使用cat和grep命令进行查找。例如:$ cat INSTALL | grep -E "newer|later" 5. 创建一个build目录,并进入该目录。例如:$ mkdir build && cd build 6. 运行configure命令来配置glibc的安装选项。您可以根据需要指定不同的选项。例如:$ ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks --disable-werror 7. 如果在编译过程中出现报错可能是由于Python版本过低导致的。您可以使用yum命令安装Python3并升级它。例如:# yum install python3 8. 运行make命令进行编译。您可以使用-j选项指定并行编译的线程数。例如:$ make -j6 9. 完成编译后,运行make install命令进行安装。例如:$ make install 10. 最后,您可以使用strings命令查看/lib64/libc.so.6文件中的GLIBC版本信息,以验证安装是否成功。例如:$ strings /lib64/libc.so.6 | grep GLIBC 请注意,以上步骤仅供参考,具体操作可能因系统环境和需求而有所不同。在执行这些步骤之前,请确保您了解自己的操作系统和环境。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值