memcmp只适用于字符串吗?

时间:2014-07-18 20:46:13

标签: c memcmp

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

例如:

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

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

我希望更好地了解这个功能,我想知道我是否使用它错了,或者是否有类似的功能来比较保存int的内存块值。

3 个答案:

答案 0 :(得分:2)

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

  • 在小端处理器上,您有:
    • 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

如你所见:

  • 在小端处理器上,在比较第一对字节(0x05> 0x00)后将返回+1
  • 在big-endian处理器上,在比较第三对字节(0x00< 0x01)后将返回-1

答案 1 :(得分:1)

memcmp将比较字节(又名char)。要知道x个字节的int是大于还是小于另一个,你需要知道其表示的字节顺序。

为什么不直接比较int

*a > *b
*a < *b
*a == *b
*a != *b

答案 2 :(得分:0)

您必须使用以小端格式在内存中存储整数的系统(即5是05 00 00 00而256是00 01 00 00)。当memcmp这些值时,第一个值的第一个字节大于第二个值的第一个字节,因此返回值大于0.