c - memcmp返回值,行为不一致

标签 c libc memcmp

下面是一段简短的 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() 使用文字不会调用标准库中的代码并且编译器本身会替换比较 -10 的调用('\200'1 + 0b1111111); memcmp() 使用变量调用调用标准库中的代码,该代码将原始有符号字符转换为无符号字符并比较 1280

关于c - memcmp返回值,行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536001/

相关文章:

c - 浮点乘法执行速度较慢,具体取决于 C 中的操作数

c - 以相反顺序打印数组

c - ANSI C (C89) 中的 Stdint.h

c - C结构的内部一致性

c - memcmp 中的意外段错误

c - 如果 shell 输出通过管道传输到某处,fork() 会导致父级 main 的开头执行

c - long double的浮点错误

c - 如何理解glibc交叉引用?

c - 使用有效指针的 Memcpy 段错误

c - 将 memcpy 或 memcmp 与范围一起使用