小议大小端模式对C语言的共用体结构的影响
2011-12-29 21:00
176 查看
1、一些问题
问题1view plaincopy to clipboardprint?
#include "stdio.h"
union
{
int i;
char ch[2];
}key;
main()
{
key.i=65*256+66;
printf("%c\t%c\n",key.ch[0],key.ch[1]);
}
view plaincopy to clipboardprint? union myun { struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =4; a.u.y =5; a.u.z =6; a.k = 0; printf("%d %d %d\n",a.u.x,a.u.y,a.u.z); return 0; } union myun { struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =4; a.u.y =5; a.u.z =6; a.k = 0; printf("%d %d %d\n",a.u.x,a.u.y,a.u.z); return 0; }union类型是共享内存的,以size最大的结构作为自己的大小,这样的话,myun这个结构就包含u这个结构体,而大小也等于u这个结构体的大小,在内存中的排列为声明的顺序x,y,z从低到高,然后赋值的时候,在内存中,就是x的位置放置4,y的位置放置5,z的位置放置6,现在对k赋值,对k的赋值因为是union,要共享内存,所以从union的首地址开始放置,首地址开始的位置其实是x的位置,这样原来内存中x的位置就被k所赋的值代替了,就变为0了,这个时候要进行打印,就直接看内存里就行了,x的位置也就是k的位置是0,而y,z的位置的值没有改变,所以应该是0,5,6。
问题3
view plaincopy to clipboardprint?
int checkCPU()
{
union
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1); // 小端返回TRUE,大端返回FALSE
}
view plaincopy to clipboardprint? union { int a[2]; long b; char c[4]; }s; main() { s.a[0]=0x12345678; s.a[1]=0x23456789; printf("%lx\n",s.b); printf("%x,%x,%x,%x\n",s.c[0],s.c[1],s.c[2],s.c[3]); } union { int a[2]; long b; char c[4]; }s; main() { s.a[0]=0x12345678; s.a[1]=0x23456789; printf("%lx\n",s.b); printf("%x,%x,%x,%x\n",s.c[0],s.c[1],s.c[2],s.c[3]); }答案是:
12345678
78,56,34,12
问题5
view plaincopy to clipboardprint?
# include <stdio.h>
main()
{
union {
long i;
int k;
char ii;
char s[4];
} mix ;
mix.k=0x23456789;
printf("mix.i=%lx\n",mix.i);
printf("mix.k=%x\n",mix.k);
printf("mix.ii=%x\n",mix.ii);
printf("mix.s[0]=%x\tmix.s[1]=%x\n",mix.s[0],mix.s[1]);
printf("mix.s[2]=%x\tmix.s[3]=%x\n",mix.s[2],mix.s[3]);
return 0;
}
view plaincopy to clipboardprint? typedef unsigned char BYTE; //报文内容联合体 typedef union tagPacketContent { STRUCTTYPE1 pkt1; STRUCTTYPE2 pkt2; STRUCTTYPE3 pkt1; STRUCTTYPE4 pkt2; }PacketContent; //统一的报文数据结构 typedef struct tagPacket { BYTE pktType; PacketContent pktContent; }Packet; typedef unsigned char BYTE; //报文内容联合体 typedef union tagPacketContent { STRUCTTYPE1 pkt1; STRUCTTYPE2 pkt2; STRUCTTYPE3 pkt1; STRUCTTYPE4 pkt2; }PacketContent; //统一的报文数据结构 typedef struct tagPacket { BYTE pktType; PacketContent pktContent; }Packet;当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用共用体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用共用体来发挥其长处。把几种不同类型的变量放到同一段内存单元中,这些变量在内存中占用的字节数可能不同,但都从同一个地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。同一个内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一种,而不能同时存放几种。即,每一瞬间只有一个成员起作用,其他的成员不起作用,不能同时存在和起作用。共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去了作用。
2.2、大小端模式对共用体的影响
当共用体中有不同类型的变量,用一种变量类型给共用体赋值,但用另一种变量类型读取共用体的时候就涉及到大小端的问题。比如在问题1中,给int类型的变量i赋值,但通过char类型的数组来读取时,就要注意字节序的问题,也就是大小端的问题。
来源:http://blog.csdn.net/ce123/article/details/7097026
相关文章推荐
- 小议大小端模式对C语言的共用体结构的影响
- 小议大小端模式对C语言的共用体结构的影响
- 小议大小端模式对C语言的共用体结构的影响
- 小议大小端模式对C语言的共用体结构的影响
- 小议大小端模式对C语言的共用体结构的影响
- 小议大小端模式对C语言的共用体结构的影响
- 互联网从不同的方向影响和改变着传统商业模式的竞争结构
- 大小端模式对union 类型数据的影响
- c语言实现大小端判断和二进制模式写入各种数据到文件
- 不同体系结构的处理器的大小端模式 .
- 测试编辑器属哪种模式,使用C语言判断处理器的大小端
- 端小端存储模式以及其对Union数据类型的影响
- [C语言]大小端模式
- 共用体中涉及的大端和小端存储模式
- 数据结构之串的模式匹配(C语言实现)
- C语言判断数据存储时大端模式还是小端模式
- 用c语言判断计算机是大端模式还是小端模式
- 【C语言深度剖析】测试系统存储是大端模式还是小端模式的方法
- 【C语言】[其他]:函数判断大端模式还是小端模式
- 大小端模式对union类型数据的影响