a<b和a-b<0在数学中结果是相同的,但在编程中,由于存在溢出,结果是不同的。
例如下面的例子(C语言):
#include<stdio.h>
int main(){
int a=2147483647;
int b= -1;
printf("%d\n",a<b);
printf("%d\n",a-b<0);
return 0;
}
返回结果:
0
1
这是由于a-b的结果为2147483648,存在正溢出,打印出a-b的值看一下:
#include<stdio.h>
int main(){
int a=2147483647;
int b= -1;
printf("%d\n",a-b);
return 0;
}
返回结果:
-2147483648
可以看到溢出后的a-b值为-2147483648,已经是负数,所以a-b<0的结果为true。
其实a<b在汇编层也利用了a-b的值,只不过还利用了一个溢出位OF。
其结果为a-b小于0异或上OF。
例如:
a-b<0,且没有溢出时,a<b为true;
a-b<0,但存在溢出,说明a-b的真实值大于0(负溢出,真实结果为正),因此a<b为false
结论:当可能溢出时,a<b和a-b<0不一致,需要用a<b,而不是a-b<0
版权声明:本文为qq_39370615原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。