0
#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 的 num 比 test2 大,打印的值不应该是正数吗?

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

4

2 回答 2

6

正如评论中所指出的,memcmp()运行字节比较。这是一个男人的报价

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

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

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

一个应用memcmp()是测试两个大数组是否相同,这可能比编写一个逐个元素比较的循环更快。有关更多详细信息,请参阅此堆栈问题。为什么 memcmp 比 for 循环检查快得多?

于 2018-11-27T01:09:45.230 回答
4

memcmp比较内存。也就是说,它比较用于表示对象的字节。用于表示对象的字节可能因一种 C 实现而异。根据 C 2018 6.2.6 2:

除了位域,对象由一个或多个字节的连续序列组成,其数量、顺序和编码要么明确指定,要么由实现定义。

要比较对象表示的,请使用普通运算符<<=>>===!=。比较对象的内存memcmp应该用于有限的目的,例如将对象插入到只需要能够存储和检索项目而不关心它们的值意味着什么的树中。

于 2018-11-27T01:03:06.013 回答