取值为long的函数,并在C中以相反的顺序返回其字节

时间:2013-01-21 07:22:57

标签: c pointers byte-shifting

我正在做一个功课,要求我编写一个带有长值的函数,并在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 个答案:

答案 0 :(得分:3)

您可能希望使用sizeof(long)代替8

...
size_t i;
size_t sizeLong = sizeof(long);
for (i=0; i<sizeLong ;i++)
{    
    outp[i] = inp[sizeLong-i-1]; 
}
...

答案 1 :(得分:2)

使用您的输入,您的代码在我的系统上运行正常。我很确定你的长期是32位。

我不允许在5分钟后编辑我的评论,所以我会在这里写。

C确保int必须至少与short一样大,而long必须至少与int一样大。因此,您的编译器会根据目标平台(处理器)选择最佳大小。

答案 2 :(得分:1)

根据您的描述,您似乎忽略了截断常量值的警告

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

因为你的长片看起来只有32位。

在循环中使用sizeof()而不是8,它应该可以正常工作。

在你的课程开始时你可以写

assert( sizeof(long) == 4 ); // to see if it is 32-bit or not.

答案 3 :(得分: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;
}