Dieu_qiu 2023-03-11 16:20 采纳率: 100%
浏览 31
已结题

无符号数溢出判断,返回值要求全一

是一个面试题,让我写一个函数,函数的参数定义为无符号整形,让我判断溢出,溢出返回全一,无溢出则进行函数要求。怎么判断无符号的溢出和返回值为全1啊。

  • 写回答

2条回答 默认 最新

  • ksgpjhqf 2023-03-11 23:16
    关注

    如果是相加,可以利用a+b<a判断溢出,如果a+b<a为真,则溢出,反之则未溢出。
    如果是相乘,可以根据a和b的最高位位数判断,例如a=b=65536都是4字节,用二进制表示为1 0000 0000 0000 0000,最高位为16位(从0开始数),16加16等于32大于4字节的最高位31位,必然溢出;如果相加小于30位,则必然不溢出;如果相加等于31位,则将a一个最高位和剩余部分分别与b相乘,再利用加法判断是否溢出。由于最高位与b相乘时不会进位,因此不会溢出;而剩余部分的最高位位数与b的最高位位数相加等于30,也不会溢出,所以不会误判。

    #include<stdio.h>
    
    typedef enum{
        FALSE,TRUE
    }BOOL;
    
    int gethighestbitnum(unsigned int a) {
        int r = -1;
        while (a > 0) {
            a >>= 1;
            r++;
        }
        return r;
    }
    
    BOOL plus_overflow(unsigned int a, unsigned int b) {
        return a + b < a;
    }
    
    BOOL multiply_overflow(unsigned int a, unsigned int b) {
        unsigned int temp;
        int l1, l2, lmax = 8 * sizeof(unsigned int) -1;
        l1 = gethighestbitnum(a);
        l2 = gethighestbitnum(b);
        if (l1 + l2 > lmax) {
            return TRUE;
        } else if (l1 + l2 < lmax) {
            return FALSE;
        } else {
            temp = b << l1; //b与a最高位取出来相乘
            a = a & ~(1 << l1); //a去掉最高位
            a = a * b;
            return temp + a < temp;
        }
    }
    
    int main() {
        unsigned int a, b, max = -1;
        
        printf("请输入两个小于%u的非负加数:\n", max);
        scanf("%u%u", &a, &b);
        if (plus_overflow(a, b))
            printf("加法溢出了!\n");
        else 
            printf("%u + %u = %u\n",a,b, a + b);
            
        printf("请输入两个小于%u的非负乘数:\n", max);
        scanf("%u%u", &a, &b);
        if(multiply_overflow(a,b))
            printf("乘法溢出了!\n");
        else 
            printf("%u * %u = %u\n",a,b, a * b);
        return 0;
    }
    

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 3月11日

悬赏问题

  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用