这是一个小的C代码,突出显示memcmp返回值上的问题:
char *str1 = "\200";
char *str2 = "\0";
int val1 = memcmp(str1, str2, 2);
int val2 = memcmp("\200", "\0", 2);
printf("val 1 : %d \n",val1);
printf("val 0 : %d \n",val2);
标准输出为:
val 1 : 128
val 2 : -1
两个函数调用之间是否有区别? 感谢您的帮助。
clang版本:
Apple LLVM版本9.0.0(clang-900.0.39.2) 目标:x86_64-apple-darwin16.7.0
答案 0 :(得分:1)
根据POSIX文档memcmp()
internally uses unsigned char
。
我想你的char
是signed
。
我的猜测(如果我正确解释了https://godbolt.org/z/iOIbil)是memcmp()
带有文字的内容不会调用标准库中的代码,并且编译器本身将替换调用比较-1
和0
('\200'
是1 + 0b1111111
);通过变量进行memcmp()
调用会调用标准库中的代码,该库会将原始签名的char转换为unsigned char
并比较128
和0
。