关于补码溢出问题---深入理解计算机系统练习题2.32

qq_38132836 2017-03-30 08:29:30
//这是一个判断补码加法是否溢出的函数,若不会,则返回1
int tadd_ok( int x, int y)
{
int sum = x+y;
int neg_over = x < 0 && y < 0 && sum >= 0;
int pos_over = x >= 0 && y >= 0 && sum < 0;
return !neg_over && !pos_over;
}


//这是一个计算x-y是否溢出的函数
int tsub_ok ( int x, int y) {
return tadd_ok(x,-y);
}

为什么说:
tsub_ok函数在y值为TMin(符号数的最小值,如果字长是八位的,则为-128)时,x为任何值结果都不对。而如果-y为TMin时,x<0时,都会认为是负溢出,但其本身并没有溢出。

我个人的想法是:
当tsub_ok的参数字长为8时,y = TMin = -128 = [1000 0000]
而此时-y为128,则其二进制表示为[0 1000 0000],此时-y本身为负溢出(-y相当于0-y),x的范围为-128~127,此时无论如何相加,均不符合tadd_ok中任何一种溢出情况。

当tadd_ok参数字长为8时,才有-y = TMin = -128 = [1000 0000]
那么作为tsub_ok的参数y本身的字长是9位的,y为[0 1000 0000],所以运算范围也就变成了-256~255,所以在该情况下即便x为负数,必然不会出现负溢出情况,但是因为tadd_ok的参数是8位的,所以会出现错误。

不知道我想的对不对,希望大神指针
...全文
482 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-31
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 仅供参考:
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧