-2

如果我发送memcmp两个指向整数的指针,那么它似乎将整数解释为字符。

例如:

int a = 5;
int b = 256;
int res = memcmp(&a,&b,sizeof(int));

在上面的代码中,它返回 1。

我想更好地理解这个函数,我想知道我是不是用错了,或者是否有类似的函数来比较内存块的int值。

4

3 回答 3

5

假设 an 的大小int为 4 个字节(大多数情况下,但并非总是如此):

  • 在 little-endian 处理器上,您有:
    • int a = 5; // Lowest address to highest address 0x05 0x00 0x00 0x00
    • int b = 256; // Lowest address to highest address 0x00 0x01 0x00 0x00
  • 在大端处理器上,您有:
    • int a = 5; // Lowest address to highest address 0x00 0x00 0x00 0x05
    • int b = 256; // Lowest address to highest address 0x00 0x00 0x01 0x00

现在,函数memcmp按顺序比较每对字节:

  • 如果第一个操作数的字节大于第二个操作数的字节,则返回+1
  • 如果第一个操作数的字节小于第二个操作数的字节,则返回 -1
  • 如果它在没有遇到任何这样的字节对的情况下完成比较,则返回 0

如你看到的:

  • 在 little-endian 处理器上,它会在比较第一对字节 (0x05 > 0x00) 后返回 +1
  • 在大端处理器上,它会在比较第三对字节(0x00 < 0x01)后返回 -1
于 2014-07-18T21:09:16.707 回答
2

memcmp将比较字节(又名char)。要知道intx 字节中的一个比另一个更大或更小,您需要知道它的表示的字节序。

为什么不直接比较ints 呢?

*a > *b
*a < *b
*a == *b
*a != *b
于 2014-07-18T20:51:29.033 回答
0

您必须使用以小端格式(即 5 is05 00 00 00和 256 is 00 01 00 00)将整数存储在内存中的系统。当你memcmp这些值时,第一个值的第一个字节大于第二个值的第一个字节,所以返回值大于 0。

于 2014-07-18T20:59:38.090 回答