加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

小议大小端模式对C语言的共用体结构的作用

发布时间:2021-11-24 13:58:28 所属栏目:教程 来源:互联网
导读:小议大小端模式对C语言的共用体结构的影响 1、一些问题 问题1 [plain] #include stdio.h union { int i; char ch[2]; }key; main() { key.i=65*256+66; printf(%ct%cn,key.ch[0],key.ch[1]); } 答案是B A;为什么不是A B呢? 在前面的文章中我们已经测试过

小议大小端模式对C语言的共用体结构的影响
1、一些问题
问题1
 
[plain]
#include "stdio.h"  
union   
{  
    int i;  
    char ch[2];  
}key;  
main()  
{  
    key.i=65*256+66;  
    printf("%ct%cn",key.ch[0],key.ch[1]);  
}  
答案是B      A;为什么不是A      B呢?
        在前面的文章中我们已经测试过(相关阅读:http://www.linuxidc.com/Linux/2012-02/53889.htm 与 http://www.linuxidc.com/Linux/2012-02/53890.htm),X86体系结构的CPU是小端模式的。比如一个数0x1234,放在内存里按照内存地址从低往高实际上是低地址字节里放的是0x34,高字节里放的是0x12。小端模式和我们平时感觉上的一致,把数位数越高的部分放在地址越高的部分。union类型是共享内存的,union中是按照从低到高放的,i=0x4142,也就是低地址中放的是42,高地址中放的是41,按照ch[0],ch[1]的顺序输出就是B      A。如果是大端模式的话就是打印两个空了,故不会出现A      B的情况。
 
问题2
 
[plain]
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 %dn",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。

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!