【发布时间】:2013-01-21 07:22:56
【问题描述】:
我正在做一个作业,要求我编写一个函数,该函数接受一个 long 值并在 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() 做错了什么
【问题讨论】:
-
long在您的机器上是 32 位类型吗? -
您应该使用
stdint.h中的uint64_t类型。它保证是64位。除此之外,使用按位运算符进行字节交换。 -
除了编辑之外,您还可以使用按位运算符解决此问题,这将帮助您避免违反严格的别名规则。查看
htonl的实现作为示例。 -
@TedWoo 在程序顶部添加
#include <stdint.h>。sizeof (long)会告诉你有多少字节;i<sizeof (long)会比i<8更好。 -
阅读
man endian:您可以使用其中的宏进行字节顺序转换。
标签: c pointers byte-shifting