按照这种想法我们实现long long int(64bit) 类型,把它分割成两个int(32bit),然后分别使用htonl(),分别转换,然后再将两种int交换顺序重新组合,即实现了整个64位的八个字节的翻转。
代码如下:
#include <stdio.h>
struct ST{
int val1;
int val2;
};
union test {
long long int val;
struct ST st;
};
int main(void)
{
long long int a;
union test u1, u2;
a = 0x7654321087654321LL;
u1.val = a;
u2.st.val2 = htonl(u1.st.val1);
u2.st.val1 = htonl(u1.st.val2);
printf("val1 is 0x%x\n", u2.st.val1);
printf("val2 is 0x%x\n", u2.st.val2);
printf("u1.val is : 0x%llx\n", u1.val);
printf("after convert is : 0x%llx\n", u2.val);
return 0;
}
执行结果:
val1 is 0x10325476
val2 is 0x21436587
u1.val is : 0x7654321087654321
after convert is : 0x2143658710325476
另外注意long long int 最大值是0x7fffffffffffffff,即7后面15个f(2的63次方减1) unsigned long long int 最大值是0xffffffffffffffff,16个f(2的64次方减1)。程序中long long int 可以简写为 long long,但是记住这是简写,就像long是long int的简写。
想看数据在内存中如何存储的,就用gdb吧!使用gdb中 x命令,如 x /xb &a表示要察看存储在变量a中的前一个字节(byte)中的数据(16进制)。x /xw &a 就是要察看变量a中前4个字节(word)数据(16进制)。x /xg &a 察看a开始8个字节的数据。