我正在制作一个函数来获取每个大小为 SIZ 的 NMEMB 成员数组的最大值,并将每个成员与memcmp()
. 问题是在比较有符号整数时,结果是不正确的,但同时是正确的。这是一个例子:
void *
getmax(const void *data, size_t nmemb, size_t siz){
const uint8_t *bytes = (const uint8_t *)data;
void *max = malloc(siz);
if (!max){
errno = ENOMEM;
return NULL;
}
memcpy(max, bytes, siz);
while (nmemb > 0){
hexdump(bytes, siz);
if (memcmp(max, bytes, siz) < 0)
memcpy(max, bytes, siz);
bytes += siz;
--nmemb;
}
return max;
}
int
main(int argc, char **argv){
int v[] = {5, 1, 3, 1, 34, 198, -12, -11, -0x111118};
size_t nmemb = sizeof(v)/sizeof(v[0]);
int *maximum = getmax(v, nmemb, sizeof(v[0]));
printf("%d\n", *maximum);
return 0;
}
hexdump()
只是一个调试功能,不会改变程序。
编译执行时输出如下:
05 00 00 00 // hexdump() output
01 00 00 00
03 00 00 00
01 00 00 00
22 00 00 00
c6 00 00 00
f4 ff ff ff
f5 ff ff ff
e8 ee ee ff
-11 // "maximum" value
这是正确的,因为memcmp()
比较一个字节字符串并且不关心类型或符号,所以-11 = 0xfffffff5
数组中的最大字节字符串是,v[]
但同时不正确,因为-11
它不是数组中的最大整数。
有没有办法使用这个函数获取数组的最大整数?