在学习计算机组成原理的时候,看到大端小端模式,便想实验一下,首先介绍一下 C 中的union,这个平时用得少,估计在单片机这种可能会运用,在平时写代码的时候几乎是用不着union的。
union:联合
- 联合从外观上看上去和结构体差不过,都是多种数据构成的集合。
1 union number 2 { /*定义一个联合*/ 3 int i; 4 char b; 5 };
- 其最大的特点:所有的元素共享同一块地址空间(起始地址一致),该union定义的变量,其长度就是union中长度最大元素的长度。
- 为union中一个元素赋值就是为该块内存空间重新赋值,所有元素的取值全部发生变化。
通过下面这个程序能够检验大端/小端:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 void SysCheck() 5 { 6 union IsLitte_Endian 7 { 8 int i; 9 char c; 10 }; 11 IsLitte_Endian Check; 12 Check.i = 1; 13 bool Flag = Check.c == 1; //Flag为true表示是小端模式,Flag为false表示为大端模式,此时Flag为true。 14 cout << Flag; 15 return; 16 } 17 18 int main() { 19 SysCheck(); 20 }
- 定义了一个union,里面具有int i (32bit) , char c (8bit) ;
- 为 i 赋值1,按照16进制写: 0x0001H;
- 如果按小端存储,那么低位1,会放在首地址,char c占用1B,因此c的值为1;如果按照大端存储,那么低位为0,放在高地址,c的值为1;
再用一个例子加深理解:
1 #include <stdio.h> 2 int main() 3 { 4 union number 5 { /*定义一个联合*/ 6 int i; 7 struct 8 { /*在联合中定义一个结构*/ 9 char first; 10 char second; 11 }half; 12 }num; 13 num.i = 0x4241; /*联合成员赋值*/ 14 printf("%c%c\n", num.half.first, num.half.second); 15 num.half.first = 'a'; /*联合中结构成员赋值*/ 16 num.half.second = 'b'; 17 printf("%x\n", num.i); 18 getchar(); 19 return 0; 20 21 }
经过第一个实验,发现我的编译器是按照小端模式进行处理。
- num.i=0x4241,根据小端模式,first对应0x41H,second对应0x42H。 分别对应ASCII字符 'A','B'。
- 对first和second进行赋值(十进制赋值),‘a’=61,'b'=62,因此最终结果是6261。