为什么在有正差异的情况下memcmp返回负值?

时间:2018-11-27 00:22:59

标签: c string.h

#include <stdio.h>
#include <string.h>

int main()
{
    int test1 = 8410092;    // 0x8053EC
    int test2 = 8404974;    // 0x803FEE
    char *t1 = ( char*) &test1;
    char *t2 = (char*) &test2;
    int ret2 = memcmp(t1,t2,4);

    printf("%d",ret2);

}

这是一个非常基本的功能,运行时会打印-2。也许我完全误解了memcmp,但是我认为它是否返回前几个不同字节之间的差。由于test1的数字大于test2的数字,所以打印的值不应该为正吗?

我正在为ubuntu使用标准gcc.7编译器。

2 个答案:

答案 0 :(得分:5)

如注释中所指出,memcmp()运行字节比较。这是男人的报价

  

int memcmp(const void * s1,const void * s2,size_t n);

     

返回值:          memcmp()函数返回小于,等于或等于的整数          如果分别找到s1的前n个字节,则大于零;          小于,匹配或大于的前n个字节          s2          对于非零返回值,符号由符号的符号决定。          第一对字节之间的差异(解释为无符号)          char)在s1和s2中不同。          如果n为零,则返回值为零。   http://man7.org/linux/man-pages/man3/memcmp.3.html

如果字节不相同,则差异的符号取决于目标字节顺序。

memcmp()的一个应用程序正在测试两个大数组是否相同,这可能比编写循环逐元素比较的循环要快。有关更多详细信息,请参阅此堆栈问题。 Why is memcmp so much faster than a for loop check?

答案 1 :(得分:4)

memcmp比较内存。即,它比较用于表示对象的字节。用于表示对象的字节可能因一个C实现而异。 Per C 2018 6.2.6 2:

  

除位字段外,对象由一个或多个字节,数字,   顺序,以及其编码是明确指定的还是实现定义的。

要比较对象表示的,请使用普通运算符<<=>>=,{{1} }和==。将对象的内存!=进行比较应用于有限的目的,例如将对象插入只需要能够存储和检索项目而无需关心其值含义的树中