-2

整数への 2 つのポインターを送信memcmpすると、整数が文字として解釈されるようです。

例えば:

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

上記のコードでは、1 を返します。

この関数の理解を深めたいのですが、使い方が間違っているのか、値を保持するメモリのブロックを比較するための同様の関数があるのか​​ 疑問に思っていintます。

4

3 に答える 3

5

an のサイズ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 オペランドのバイトが第 2 オペランドのバイトより大きい場合、+1 を返します。
  • 第 1 オペランドのバイトが第 2 オペランドのバイトより小さい場合、-1 を返します。
  • そのようなバイトのペアに遭遇せずに比較を完了すると、0 が返されます。

ご覧のように:

  • リトルエンディアン プロセッサでは、最初のバイト ペアを比較した後、+1 を返します (0x05 > 0x00)。
  • ビッグ エンディアン プロセッサでは、3 番目のバイト ペア (0x00 < 0x01) を比較した後、-1 を返します。
于 2014-07-18T21:09:16.707 に答える
0

メモリに整数をリトルエンディアン形式で格納するシステムを使用している必要があります (つまり、5 は05 00 00 00で、256 は です00 01 00 00)。これらの値を使用するmemcmpと、最初の値の最初のバイトが 2 番目の値の最初のバイトより大きいため、戻り値は 0 より大きくなります。

于 2014-07-18T20:59:38.090 に答える