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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_39370615/article/details/112426732