网络通讯编程

union分配和大小端

2019-03-22  本文已影响0人  奥斯特洛司机

题目:

看程序写出输出结果

 #include <iostream>
using namespace std;
typedef union
{
         int i;
         struct
         {
                   char a;
                   char b;
                   char c;
                   char d;
         }ch;
} test;
 
int main()
{
         test obj;
         obj.i = 0x41424344;
         cout << obj.ch.a << ' ' << obj.ch.b  << ' ' << obj.ch.c << ' ' << obj.ch.d<< endl;
 
         obj.ch.a = 'a';
         obj.ch.b = 'b';
         obj.ch.c = 'c';
         obj.ch.d = 'd';
         cout << hex << obj.i << endl;
         system("pause");

         return 0;
}

基本概念:

这题涉及到Union的内存分配问题和大小端的问题。

下面先对大小端和Union内存分配的概念进行讲述。
1. 小端模式: 字数据的高字节存放在高地址中,而字数据的低字节则存放在低地址中。
2. 大端模式: 字数据的高字节存放在低地址中,而字数据的低字节则存放在高地址中。
3. Union类型的数据所占的空间等于最大的成员所占的空间,对union 型的成员的存取都是相对于该联合体基地址(低地址)的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始,因此,大小端模式存储将会直接影响union内成员的值。

分析过程:
由于我机器是小端机器,obj.i= 0x41424344的内存存储如下:
0x0003
0x0002
0x0001
0x0000
41(‘A’)
42(‘B’)
43(‘C’)
44(‘D’)
而对于ch这个内部结构来说,ch.a对应于0000位置,ch.d对应于0003位置:

0x0003
0x0002
0x0001
0x0000

41(‘A’)
42(‘B’)
43(‘C’)
44(‘D’)

Ch.d
Ch.c
Ch.b
Ch.a

于是在 cout << obj.ch.a << ' ' << obj.ch.b << ' ' << obj.ch.c << ' ' << obj.ch.d<< endl;

输出结果为DCBA的顺序。
同样,当
obj.ch.a = 'a';
obj.ch.b = 'b';
obj.ch.c = 'c';
obj.ch.d = 'd';

内存的分布如下:

0x0003
0x0002
0x0001
0x0000
‘d’(64)
‘c’(63)
‘b’(62)
‘a’(61)
于是obj.i输出的值为64636261的顺序。

那我们来看一下以下输出会是什么
union{
short i;
char c[2];
}  a;

ddd un;
a.c[1] = 20;
a.c[2] = 2;

printf("%d",un.i);  //00000010 00010100  = 532
上一篇 下一篇

猜你喜欢

热点阅读