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 回答