使用红黑树的时候遇到一个奇怪的问题,树没有正确平衡,查了半天才发现是比较函数有问题,下面是比较函数
int cmp(unsigned int a, unsigned int b)
{
return (int)a - (int)b;
}
当输入0xbe04010a,0x3902010a的时候,返回值是负数,无符号的0xbe04010a明显比0x3902010a,这么用肯定会出问题。
这是因为0xbe04010a转换为整形后是负数,负数减正数肯定是负数,导致比较结果错误。
这样修改后就工作正常了,无符号数转有符号进行运算的时候一定要小心
include <stdio.h>
#include <stdlib.h>
int cmp(unsigned int a, unsigned int b)
{
if (a > b) return 1;
else if (a < b) return -1;
else return 0;
}
int main(void)
{
unsigned int as[] = {0xbe04010a, 0x3902010a, 0x5703010a};
printf("%#x %#x %d\n", as[0], as[1], cmp(as[0], as[1]));
printf("%#x %#x %d\n", as[0], as[2], cmp(as[0], as[2]));
printf("%#x %#x %d\n", as[1], as[2], cmp(as[1], as[2]));
return 0;
}