woshigeshuai 发表于 2022-5-9 10:00:16

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


long apple1;
int        two;

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

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

yunqing_abc 发表于 2022-5-9 10:03:58

加之前先判断一下,如果大于等于0XFFFFFF9C,再加就溢出了,就不要加了

woshigeshuai 发表于 2022-5-9 10:09:01

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

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

wye11083 发表于 2022-5-9 10:11:27

比较啥。。直接(A&0x80000000)!=(B&0x80000000)。

yyts 发表于 2022-5-9 10:23:59

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

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

woshigeshuai 发表于 2022-5-9 10:41:43



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

DoDoTech 发表于 2022-5-9 11:30:24

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

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

modbus 发表于 2022-5-9 13:58:20

判断apple1小于等于0时就是溢出了

redroof 发表于 2022-5-9 14:09:31

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

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

初音之恋 发表于 2022-5-9 14:39:23

本帖最后由 初音之恋 于 2022-5-9 14:42 编辑

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

yyts 发表于 2022-5-9 18:05:02

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

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

redroof 发表于 2022-5-9 18:12:32

yyts 发表于 2022-5-9 18:05
就算能读到,也可能会有问题,比如刚好来个中断。
(引用自11楼)

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

yyts 发表于 2022-5-9 18:15:33

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

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

modbus 发表于 2022-5-9 21:03:19

如果是大于42亿多算溢出,这两个变量都应该定义为无符号数,然后判断如果apple1小于100则为溢出
页: [1]
查看完整版本: long数据加int数据 如何判断是否有溢出