我正在做一个功课,要求我编写一个带有长值的函数,并在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()做了什么错误
答案 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;
}