long数据加int数据 如何判断是否有溢出
long apple1;
int two;
void main()
{
apple1=1000;
two=100;
while(1)
{
apple1=apple1+two;
}
}
// 数据一直加 apple1数会越来越大,会有溢出的时候 ,就是0XFFFFFF9C + 100 =0,会溢出 。怎么判断是不是溢出呢? 加之前先判断一下,如果大于等于0XFFFFFF9C,再加就溢出了,就不要加了 yunqing_abc 发表于 2022-5-9 10:03
加之前先判断一下,如果大于等于0XFFFFFF9C,再加就溢出了,就不要加了
(引用自2楼)
如果two这个数值未知呢? 我想用apple1 加后 跟 加前 的数据比较 ,如果加后的数据小于 加前的数据,说明溢出了。
但感觉这个方法 怪怪的 比较啥。。直接(A&0x80000000)!=(B&0x80000000)。 woshigeshuai 发表于 2022-5-9 10:09
如果two这个数值未知呢? 我想用apple1 加后 跟 加前 的数据比较 ,如果加后的数据小于 加前的数据,说明 ...
(引用自3楼)
你这个方法可以,就是这样用的,不奇怪,也可以用0XFFFFFFFF-apple1,再和two比较下,就知道会不会溢出了。{:titter:}
我想通过判断C位的方法,仿真试了。最简单。
相加后有一个C位,如果是1 肯定是溢出了。 woshigeshuai 发表于 2022-5-9 10:41
我想通过判断C位的方法,仿真试了。最简单。
相加后有一个C位,如果是1 肯定是溢出了。 ...
(引用自6楼)
你这个方法不错,
实际上输入不确定的时候,先判断再运算就好了。
MISRC 规范中 明确有相关的要求 ,输入必须是确定数 判断apple1小于等于0时就是溢出了 woshigeshuai 发表于 2022-5-9 10:41
我想通过判断C位的方法,仿真试了。最简单。
相加后有一个C位,如果是1 肯定是溢出了。 ...
(引用自6楼)
问题是你C语言拿不到CPU里面的那个溢出标志位。
所以只能自己做比较了。
本帖最后由 初音之恋 于 2022-5-9 14:42 编辑
如果都是正数,只要判断相加后的值是否比相加前的值大就行了
或者申请一个long long int的做对比,只要不相等就是溢出了,这个不用考虑正负 redroof 发表于 2022-5-9 14:09
问题是你C语言拿不到CPU里面的那个溢出标志位。
所以只能自己做比较了。
...
(引用自9楼)
就算能读到,也可能会有问题,比如刚好来个中断。 yyts 发表于 2022-5-9 18:05
就算能读到,也可能会有问题,比如刚好来个中断。
(引用自11楼)
中断倒是不影响,不然就没法写程序了。
下一条指令取标志位,取到的一定是上一条指令执行的时候设置的。与中间是否被中断打断无关。
如果愿意写汇编,你确实可以写个函数来读取cpu的进位标志,但是放在c里面可能没意义,因为你必须在前面的加法执行完的后一条汇编指令的位置去读,而在c的层次上,编译器做完加法还要保存结果到目标变量,然后你就没机会读了。 redroof 发表于 2022-5-9 18:12
中断倒是不影响,不然就没法写程序了。
下一条指令取标志位,取到的一定是上一条指令执行的时候设置的。 ...
(引用自12楼)
哦,是啊,状态寄存器一般都入栈了。 如果是大于42亿多算溢出,这两个变量都应该定义为无符号数,然后判断如果apple1小于100则为溢出
页:
[1]