搜索
bottom↓
回复: 13

long数据加int数据 如何判断是否有溢出

[复制链接]

出0入0汤圆

发表于 2022-5-9 10:00:16 | 显示全部楼层 |阅读模式

long apple1;
int        two;

void main()
{
        apple1=1000;
        two=100;

        while(1)
        {
                apple1=apple1+two;        
        }
}
// 数据一直加 apple1数会越来越大,会有溢出的时候 ,就是0XFFFFFF9C + 100 =0,会溢出 。怎么判断是不是溢出呢?

出0入4汤圆

发表于 2022-5-9 10:03:58 | 显示全部楼层
加之前先判断一下,如果大于等于0XFFFFFF9C,再加就溢出了,就不要加了

出0入0汤圆

 楼主| 发表于 2022-5-9 10:09:01 | 显示全部楼层
yunqing_abc 发表于 2022-5-9 10:03
加之前先判断一下,如果大于等于0XFFFFFF9C,再加就溢出了,就不要加了
(引用自2楼)

如果two这个数值未知呢? 我想用apple1 加后 跟 加前 的数据比较 ,如果加后的数据小于 加前的数据,说明溢出了。
但感觉这个方法 怪怪的

出0入442汤圆

发表于 2022-5-9 10:11:27 | 显示全部楼层
比较啥。。直接(A&0x80000000)!=(B&0x80000000)。

出0入224汤圆

发表于 2022-5-9 10:23:59 | 显示全部楼层
woshigeshuai 发表于 2022-5-9 10:09
如果two这个数值未知呢? 我想用apple1 加后 跟 加前 的数据比较 ,如果加后的数据小于 加前的数据,说明 ...
(引用自3楼)


你这个方法可以,就是这样用的,不奇怪,也可以用0XFFFFFFFF-apple1,再和two比较下,就知道会不会溢出了。

出0入0汤圆

 楼主| 发表于 2022-5-9 10:41:43 | 显示全部楼层


我想通过判断C位的方法,仿真试了。最简单。
相加后有一个C位,如果是1 肯定是溢出了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入927汤圆

发表于 2022-5-9 11:30:24 | 显示全部楼层
woshigeshuai 发表于 2022-5-9 10:41
我想通过判断C位的方法,仿真试了。最简单。
相加后有一个C位,如果是1 肯定是溢出了。 ...
(引用自6楼)

你这个方法不错,
实际上输入不确定的时候,先判断再运算就好了。
MISRC 规范中 明确有相关的要求 ,输入必须是确定数

出0入0汤圆

发表于 2022-5-9 13:58:20 | 显示全部楼层
判断apple1小于等于0时就是溢出了

出300入477汤圆

发表于 2022-5-9 14:09:31 | 显示全部楼层
woshigeshuai 发表于 2022-5-9 10:41
我想通过判断C位的方法,仿真试了。最简单。
相加后有一个C位,如果是1 肯定是溢出了。 ...
(引用自6楼)

问题是你C语言拿不到CPU里面的那个溢出标志位。
所以只能自己做比较了。

出0入16汤圆

发表于 2022-5-9 14:39:23 | 显示全部楼层
本帖最后由 初音之恋 于 2022-5-9 14:42 编辑

如果都是正数,只要判断相加后的值是否比相加前的值大就行了
或者申请一个long long int的做对比,只要不相等就是溢出了,这个不用考虑正负

出0入224汤圆

发表于 2022-5-9 18:05:02 | 显示全部楼层
redroof 发表于 2022-5-9 14:09
问题是你C语言拿不到CPU里面的那个溢出标志位。
所以只能自己做比较了。
...
(引用自9楼)

就算能读到,也可能会有问题,比如刚好来个中断。

出300入477汤圆

发表于 2022-5-9 18:12:32 来自手机 | 显示全部楼层
yyts 发表于 2022-5-9 18:05
就算能读到,也可能会有问题,比如刚好来个中断。
(引用自11楼)

中断倒是不影响,不然就没法写程序了。
下一条指令取标志位,取到的一定是上一条指令执行的时候设置的。与中间是否被中断打断无关。
如果愿意写汇编,你确实可以写个函数来读取cpu的进位标志,但是放在c里面可能没意义,因为你必须在前面的加法执行完的后一条汇编指令的位置去读,而在c的层次上,编译器做完加法还要保存结果到目标变量,然后你就没机会读了。

出0入224汤圆

发表于 2022-5-9 18:15:33 | 显示全部楼层
redroof 发表于 2022-5-9 18:12
中断倒是不影响,不然就没法写程序了。
下一条指令取标志位,取到的一定是上一条指令执行的时候设置的。 ...
(引用自12楼)

哦,是啊,状态寄存器一般都入栈了。

出0入0汤圆

发表于 2022-5-9 21:03:19 | 显示全部楼层
如果是大于42亿多算溢出,这两个变量都应该定义为无符号数,然后判断如果apple1小于100则为溢出
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 06:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表