【发布时间】:2018-09-14 18:25:48
【问题描述】:
我看到很多人在 qsort 比较器函数中使用减法。我认为这是错误的,因为在处理这些数字时:int nums[]={-2147483648,1,2,3}; INT_MIN = -2147483648;
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
我写了这个函数来测试:
#include <stdio.h>
#include <limits.h>
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main(void)
{
int a = 1;
int b = INT_MIN;
printf("%d %d\n", a,b);
printf("%d\n",compare((void *)&a,(void *)&b));
return 0;
}
输出是:
1 -2147483648
-2147483647
但是a > b 所以输出应该是正数。
我见过很多书都是这样写的。我认为这是错误的;处理int类型时应该这样写:
int compare (const void * a, const void * b)
{
if(*(int *)a < *(int *)b)
return -1;
else if(*(int *)a > *(int *)b)
return 1;
else
return 0;
}
我只是想不通为什么许多书籍和网站以这种误导性的方式写作。 如果您有任何不同的看法,请告诉我。
【问题讨论】:
-
qsort()的链接是什么,信号整数的溢出是未定义的行为,您期望什么?还有一个INT_MAX和1 + INT_MIN溢出。 -
我想知道我是不是错了,我认为只是使用 - 比较是错误的,你说的应该是 1+INT_MAX 溢出?
-
基础数学,
1 - (-INT_MIN) == 1 + INT_MIN -
@Stargateur 你错了,1-INT_MIN = 1+ -INT_MIN = 1 +2147483648 ,因为INT_MAX = 2147483647,然后溢出
-
你是对的,由于溢出,使用减法进行比较是错误的,要么转换为更大的类型(长),要么使用标准 if/else