是一个面试题,让我写一个函数,函数的参数定义为无符号整形,让我判断溢出,溢出返回全一,无溢出则进行函数要求。怎么判断无符号的溢出和返回值为全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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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 库的使用