下面是一段简短的 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
最佳答案
根据 POSIX 文档,memcmp()
internally uses unsigned char
.
我想你的char
是签名的
。
我的猜测(如果我正确解释 https://godbolt.org/z/iOIbil )是 memcmp()
使用文字不会调用标准库中的代码并且编译器本身会替换比较 -1
和 0
的调用('\200'
是 1 + 0b1111111
); memcmp()
使用变量调用调用标准库中的代码,该代码将原始有符号字符转换为无符号字符
并比较 128
和 0
。
关于c - memcmp返回值,行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536001/