3

私は宿題をしていて、長い値を取り、そのバイトを逆順に返す関数をCで書く必要があります.関数のプロトタイプが与えられています.

long swapLong(long x)

私のコードは次のようになります:

long swapLong(long in)
{
    long out;
    char *inp = (char *) &in ;
    char *outp = (char *) &out;

    int i=0;
    for (i=0; i<8 ;i++)
    {    
        outp[i] = inp[7-i]; 
    }

    return out;
} 

関数の入力が 0x1122334455667788 の場合

0x8877665544332211 を返す必要があります

しかし、私がそれをテストするとき

long test2 = 0x1122334455667788;
long result2= swapLong(test2);
printf("0x %lx\n", test2);
printf("0x %lx\n", result2);

結果は 0x44332211 です

関数は入力の前半のみを交換するようで、後半に何が起こるかわかりません

私は「 int swapInt( int x) 」と呼ばれる別の関数を書いており、swapLong() と同様のアイデアを使用しており、うまく機能します....だから、swapLong() で何が間違っていたのかわかりません

4

4 に答える 4

3

sizeof(long)の代わりに使用したい場合があり8ます。

...
size_t i;
size_t sizeLong = sizeof(long);
for (i=0; i<sizeLong ;i++)
{    
    outp[i] = inp[sizeLong-i-1]; 
}
...
于 2013-01-21T07:33:55.757 に答える
2

あなたのコードは、指定された入力で私のシステムで正常に動作します。あなたの long は32ビットだと確信しています。

5分経過したコメントは編集できないので、ここに書きます。

C は、int が少なくとも short と同じ大きさで、long が少なくとも int と同じ大きさでなければならないことを保証します。そのため、コンパイラはターゲット プラットフォーム (プロセッサ) に基づいて最適なサイズを選択します。

于 2013-01-21T07:32:52.253 に答える
1

あなたが説明したことから、切り捨てられた定数値に対して得られる警告を無視しているようです

long test2 = 0x1122334455667788; // 1234605616436508552 > 2^32-1

long は 32 ビットのみのように見えるためです。

sizeof()代わりにループで使用すると、8正常に動作するはずです。

プログラムの開始時に、次のように書くことができます

assert( sizeof(long) == 4 ); // to see if it is 32-bit or not.
于 2013-01-21T07:49:20.093 に答える
0

さらなる啓蒙のためにここで何が起こっているのかを理解してください:

long swapLong(long x)
{
    int s = sizeof(long);
    long r = 0;
    for(int i=0; i<s; ++i)
    {
        r <<= 8;
        r |= x & 0xff;
        x >>= 8;
    }
    return r;
}
于 2013-01-21T08:24:18.717 に答える