其一:在union的所有数据成员中,同一时间只能存储一个数据成员。所有数据成员具有相同的地址,其空间的大小,以最大数据成员为准。eg:
union StateMachine
{
char character;
int number;
char *str;
double exp;
};
一个union只能设置一个足够大的空间来存储一个最大长度的数据成员,对于上述的例子而言:最大的长度为double型,所以StateMachine的空间大小就是double数据类型的大小。
其二:大小端对union数据类型的影响
eg.
unon
{
int i;
char a[2];
};*p.u
p=&u;
p->a[0]=0x39;
p->a[1]=0x38;
p.i的值应该为多少?
这里需要考虑存储的模式:大端和小端
大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。由此可以看出p.i的值应为0x39.
其三:如何确认当前系统的存储模式
请写一个C 函数,若处理器是Big_endian 的,则返回0;若是Little_endian 的,则返回1。
以大端模式存储,其内存布局如下图:
以小端模式存储,其内存布局如下图:
变量i 占4 个字节,但只有一个字节的值为1,另外三个字节的值都为0。如果取出低
地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是
小端模式
程序如下:
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
不过要说明的一点是,某些系统可能同时支持这两种存储模式,你可以用硬件跳线或在编译器的选项中设置其存储模式。
关键字:C语言 关键字 union
引用地址:
C语言关键字之“union”
推荐阅读最新更新时间:2024-03-16 13:51
STM32学习第四课:STM32 c语言学习基础4
1.结构体的参数传递 在进行传值的时候,用结构体封装有利于函数的传递。 用指向结构体变量的指针作为函数参数。 结构体做函数参数有三种传递方式: 一:是传递结构体变量,这是值传递 二:是传递结构体指针,这是地址传递 三:是传递结构体成员,当然这也分为值传递和地址传递。 以传引用调用方式传递结构比用传值方式传递结构效率高。以传值方式传递结构需要对整个结构做一份拷贝。 下面看一个列子,student结构体中包含该学生的各种信息,我们在change函数中对其进行部分修改,再在主函数中输出其结果 1.下面传递结构体变量 #include stdio.h #include string.h #define format %dn
[单片机]
入门第一个74HC595驱动 C语言
/******** 实验驱动74HC595 芯片******** 单片机型号:ATMEGA48PA /********** 74HC595电平逻辑********************* SI SCK SCLR RCK OE 输出管脚 X X X X H QA--QH 输出高阻 X X X X L QA--QH 输出有效值 X X L X X 称位寄存器清零 L 上沿 H X X 称位寄存器存储 L H 上沿 H X X 称位寄存器存储 H x 下沿 H X X 称位寄存
[单片机]
IAR 扩展关键字
1.扩展关键字:用于控制数据和指针 __eeprom 用于EEPROM 存储空间, 控制数据存放,控制指针类型和存放 __tinyflash, __flash, __farflash, __hugeflash 用于flash 存储空间, 控制数据存放,控制指针类型和存放 __ext_io, __io 用于I/O存储空间, 控制数据存放,控制指针类型和存放 __regvar 放置一个变量在工作寄存器中 2.函数扩展关键字: __nearfunc __farfunc 用于控制数据存放,这组关键字必须在函数声明和定义的时候指定 __interrupt. 关键字控制函数的类型。这组关键字必须在函数声明和定义的时候指定 __root
[单片机]
单片机C语言汇编代码
if(testaa++ 5) 图1 if(testaa++ 5)反汇编 图1中先将testaa值存在了R7寄存器中,然后对testaa++;再将R7中的数据同5进行做减法,通过判断是否发生借位,判断大小。 图1中,SETB C 是将C置1;JC是 Jump if carry is set 是判断C是否为1,为1则跳转。 总结:先缓存原值,后加加,然后缓存值进行判断大小; if(++testaa 5) 图2 if(++testaa 5)反汇编 图2中先作加法,后判断。 总结:先加加,然后进行判读大小;
[单片机]
51单片机C语言学习笔记3: 存储器结构
MCS-51单片机在物理结构上有四个存储空间: 1、片内程序存储器 2、片外程序存储器 3、片内数据存储器 4、片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1、片内外统一编址的64K的程序存储器地址空间(MOVC) 2、256B的片内数据存储器的地址空间(MOV) 3、以及64K片外数据存储器的地址空间(MOVX) 在访问三个不同的逻辑空间时,应采用不同形式的指令(具体我们在后面的指令系统学习时将会讲解),以产生不同的存储器空间的选通信号。 程序内存ROM 寻址范围:0000H ~ FFFFH 容量64KB EA = 1,寻址内部ROM;EA = 0,寻址外部ROM 地址长度:
[单片机]
成功软件开发者的9种编程习惯
有些人会想:只要程序运行结果好,就不管原程序编得怎样。但绝对不是这样的。软件不是一次性就作完的,有必要做修改,扩展等管理。所以原程序要尽量作成易看懂,管理方便。 这样做,第一是为了软件开发者方便,其次还会影响到软件的性能。管理不方便的程序不会作出好的软件。 希望通过这篇文章能学到好的编程习惯。要理解这文章的内容,你至少要懂得1个开发工具语言。这里举例说明的都是C语言,但你对C语言没有了解也不要担心。这里说明的是原理而不是特定的语言。 1. 语句要结束得彻底---(冒号;) 程序员经常有的失误之一是忘记在语句结束后加一个冒号。这样的问题点不易发现,时而让程序员不知所措。编程时要时时注意每个语句是否以冒号结束,虽然不是所有语言
[单片机]
STM32再学习——启动流程分析
我们写嵌入式程序,基本上采用C语言来编写,以main()作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一个专门的启动程序来完成,由于需要做的工作内容不多,并且需要更直接的管理内存,一般采用汇编编写。 本文引用地址:http://www.eepw.com.cn/article/236700.htm 无论是STM32、ARM系列的单片机,还是简单的如51,PIC等,都以为上述原因,需要启动程序,只不过51,PIC等单片机的启动程序已经在相应的IDE编译、链接的时候隐含的编译了,故在写单片机程序的时候无需考虑。而STM32的启动有相
[单片机]
Ping程序的C语言编程
大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序。 ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。 例如,在Linux终端上执行ping localhost命令将会看到以下结果: PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of
[单片机]