C++查看大端小端模式

在学习计算机组成原理的时候,看到大端小端模式,便想实验一下,首先介绍一下 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 }
  1. 定义了一个union,里面具有int i (32bit) , char c (8bit) ;
  2. 为 i 赋值1,按照16进制写: 0x0001H;
  3. 如果按小端存储,那么低位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
", num.half.first, num.half.second);
15     num.half.first = 'a'; /*联合中结构成员赋值*/
16     num.half.second = 'b';
17     printf("%x
", num.i);
18     getchar();
19    return 0;
20 
21 }

经过第一个实验,发现我的编译器是按照小端模式进行处理。

  1. num.i=0x4241,根据小端模式,first对应0x41H,second对应0x42H。  分别对应ASCII字符 'A','B'。
  2. 对first和second进行赋值(十进制赋值),‘a’=61,'b'=62,因此最终结果是6261。
原文地址:https://www.cnblogs.com/yy-1046741080/p/11537665.html