union的0x3个妙用(I)

【嵌入式面试题】union在单片机设计的妙用 这里联合体有两个成员,一个char ODR,还有一个8位的结构体,因为内存共享,这么着操作后边的结构体就可以改变ODR。从这可以看出来,联合体内存是共享的,也就是只看那部分占用内存最大则联合体占用就是该内存。1. 大小端模式对 union 类型数据的影响(51是大端,一般处理器都是小端)相应的缺点就是操作office就会改变teacher的前四个字节的值。第二个作用就是节约内存,在内存比较小的单片机内经常使用。这么每个flag占用1bit,8个才占一个字节。这么每一个flag会占用一个字节的ram空间。 阅读详情
在嵌入式系统中,一般不建议使用union结构,因为union结构中的各个成员之间存在相互影响,容易滋生问题。可见,union也是把双刃剑。懂得使用它的人可以做到“削铁如泥”,而不懂得使用它的人很可能会被其所伤。下面介绍的几种方法都是嵌入式系统常用的几种技巧。如果熟练掌握,将来定有所用。
 
1.all的使用
 
使用all的数据结构模型:
 
typedef _my_union
{
  unsigned int all;
 
  /*sizeof(my_union.my_struct)必须与sizeof(my_union.all)相等*/
  struct
  {
    ...
  }my_struct;
 
}my_union;
 
 
----------EXAMPLE 1--------
 
  嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址存放内容
0x40000x78
0x40010x56
0x40020x34
0x40030x12
  而在Big-endian模式CPU内存中的存放方式则为:
内存地址存放内容
0x40000x12
0x40010x34
0x40020x56
0x40030x78

  联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

测试代码:                                   

int isLittleEndian()
{
  union _dword
  {
    int all;
   
    struct _bytes
    {
        char byte0;/*对little来说是最低位,而对big则是最高位*/ 
        char pad[3]; 
    }bytes;
     
  }dword;
 
  dword.all=0x87654321;/*all的功能就是给dword四个字节赋值*/
 
  return (0x21==dword.bytes.byte0);/*查看第一个字节*/  
}

分析:                                     如果你的处理器调用函数isLittleEndian返回1,那么说明你的处理器为little endian,否则为big endian.注意,如果在little endian处理器上,byte0和pad按内存从低到高的存放顺序:LOW->byte0 pad[0] pad[1] pad[2] ->HIGH;0x87654321按内存从低到高的存放顺序:  0x21  0x43   0x65   0x87, 可见byte0对应到0x21。所以通过判断dword中第一个字节dword.bytes.byte0是否与0x21相等就可以看出是否是little endian。

----------EXAMPLE 2--------
#include <stdio.h>
typedef union _student
{
 unsigned int all;/*all可以同时清理或设置info中的所有内容*/
 
 struct
 {
  unsigned int  pad:         7;   
  unsigned int  used:        1;/*高位*/  
  unsigned int  personal_id: 8;
  unsigned int  class_id:    3;
  unsigned int  subject_id:  6;        
  unsigned int  score:       7;/*低位*/     
 }info; 
 
}student;
#define MAX_STUDENT_NUM 100
unsigned int  students;
unsigned int  student_database[MAX_STUDENT_NUM]={0};
 
int           add_to_database(unsigned int data);  
int           find_from_database(unsigned int personal_id);
int           delete_from_database(unsigned int personal_id);  
void          print_database(void); 
void          print_student(unsigned int data); 
 
int add_to_database(unsigned int data)
{
 student stu;
 int i;
 
 for(i=0;i<MAX_STUDENT_NUM;i++)
 {
  stu.all = student_database[i];
  
  if(!stu.info.used)
  {
   stu.all       = data;
   stu.info.used    = 1;
   
   student_database[i] = stu.all;
   return 1;
  }
 }
 
 return 0; 
} 
 
 
int find_from_database(unsigned int personal_id)
{
 student stu;
 int i;
 
 for(i=0;i<MAX_STUDENT_NUM;i++)
 {
  stu.all = student_database[i];
  
  if(stu.info.used && stu.info.personal_id==personal_id)
  { 
   return stu.all;
  }
 }
 
 return -1;  
} 
 
void print_student(unsigned int data)
{
  student stu;
  
  stu.all = data;
  
  printf("personal id %d,class id %d,subject id %d,score %d/n",
    stu.info.personal_id,stu.info.class_id,stu.info.subject_id,
    stu.info.score);
} 
 
 
void print_database(void)
{
 student stu;
 int i; 
 
 for(i=0;i<MAX_STUDENT_NUM;i++)
 {
  stu.all = student_database[i];
  
  if(stu.info.used)
  {
   print_student(stu.all);
  }
 }
}  
 
int main(int argc, char *argv[])
{ 
 student jack,jone;
 
 jack.all       = 0;
 
 jack.info.personal_id = 102;
 jack.info.class_id    = 2; /*class 2*/  
 jack.info.subject_id  = 2; /*English*/
 jack.info.score       = 50; /*fouled*/      
 add_to_database(jack.all); 
 jone.all              = 0;
  
 jone.info.personal_id = 88;
 jone.info.class_id    = 2; /*calss 2*/   
 jone.info.subject_id  = 2; /*English*/ 
 jone.info.score       = 73; /*passed*/ 
 
 add_to_database(jone.all);
 
 jack.all = find_from_database(jack.info.personal_id);
 
 if(jack.all<0)
 {
  printf("no such student with id %d/n",jone.info.personal_id);
 }
 else
 {
   printf("found!  ");
   print_student(jack.all);
 }
 
 print_database(); 
}
 
运行结果:
found!  personal id 102,class id 2,subject id 2,score 50
personal id 102,class id 2,subject id 2,score 50
personal id 88,class id 2,subject id 2,score 73
 
【嵌入式面试题】C语言union(联合体)的使用总结 与struct用法非常类似,不过其适用于不同时被用到的数据 注意: 1. 大小端模式对 union 类型数据的影响(51是大端,一般处理器都是小端) union { int i; char a[2]; }*p, u; p = &u; p->a[0] = 0x39; p->a[1] = 0x38; p.i 的值应该为多少呢? 这里需要考虑存储模式:大端模式和小端模式。 大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则 阅读详情

相关推荐

深入解析fio Benchmark测试:从源码到实践

本文深入解析fio Benchmark测试工具,从入门指南到源码架构分析,详细介绍了其核心模块、关键数据结构和I/O处理机制。通过实战案例展示如何优化存储性能测试,包括内存对齐、多线程调优等技巧,帮助开发者充分利用fio进行精准的存储性能评估。

weixin_42563415的博客 206

ARM存储格式之 大端小端

开头讲个有关大端小端的故事:   端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算...

weixin_30326741的博客 543

避开这些坑,你的Python爬虫才能稳定爬取IEEE Xplore(含反爬策略与MongoDB存储实战)

本文详细介绍了如何构建稳定的Python爬虫系统以爬取IEEE Xplore学术论文,包括反爬策略、MongoDB存储优化和断点续传机制。通过动态等待时间算法、请求头指纹管理和会话保持策略,有效应对IEEE的反爬机制。同时,优化MongoDB数据结构和索引,提升存储效率。最后,强调法律合规与伦理考量,确保爬虫合法合规运行。

weixin_29031057的博客 1095

数据结构学习之 union 共用体(union 到底有什么用?)

1、引言共用体常用来节省内存,特别是一些嵌入式编程,内存是非常宝贵的! 共用体也常用于操作系统数据结构或硬件数据结构! union 在操作系统底层的代码中用的比较多,因为它在内存共享布局上方便且直观。所以网络编程,协议分析,内核代码上有一些用到 union 都比较好懂,简化了设计。共用体(union)是一种数据格式,它能够存储不同类型的数据,但是只能同时存储其中的一种类型。主要用处分以下3个方面

ZP1015 9510

CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)2

CANoe制作网关实现CAN报文故障注入(报文长度/timeout/信号错误/E2E) 2.新建CANoe工程 3.透传功能 4.故障注入panel面板 5.CAPL代码 5.1故障注入开始、停止、定时 5.2DLC故障注入 5.3 Timeout故障注入 5.4 信号故障注入

天赐好车的博客 3674

《Linux GPU 驱动核心机制:面向图形与 AI 计算的 DRM 内存管理与任务调度》 目录

本文以缓冲区对象(BO)生命周期为主线,系统解析 Linux DRM 子系统中 GPU 驱动的核心机制。涵盖 GEM 与 TTM 内存管理、dma-buf/dma-fence 共享同步、GPU 调度与地址空间管理,结合 amdgpu、Xe 等驱动代码,深入剖析其设计动机与实现逻辑。旨在填补中文领域对 GPU 内核机制系统性讲解的空白,为图形与 AI 计算场景下的内存泄漏、同步死锁等疑难问题提供可追溯的分析路径。

图形/计算GPU的驱动与虚拟化技术分享园地 3712

对union的进一步认识与一些深层应用

虽然平时在程序开发时较少使用union,虽然当初学C语言时,union一章被老师略过没有介绍,虽然,自认为自己对union的认识已经足够,但是,在写完上一篇文章大卫的阅读笔记)C++中使用union的几点思考>之后,网上的讨论驱使我对这一基本的语言特性又投入了一些精力去关注,并写成了此文.下面以MSDN中关于union的概述作为开头,这好像有些无聊,不过,有时候看specification的东西可

大卫的思维空间 6319

【Unity 城市建模插件】POLY-Megapolis City Pack 提供超过数百种城市建筑、道路、车辆与城市家具模型,完美适用于构建现代化城市、模拟城市游戏、都市题材冒险类游戏和开放世界项目

POLY - Megapolis City Pack 是一套风格统一、内容丰富的低多边形城市建模资源包,专为 Unity 引擎设计。该资源包提供超过数百种城市建筑、道路、车辆与城市家具模型,完美适用于构建现代化城市、模拟城市游戏、都市题材冒险类游戏和开放世界项目。无论是快速原型开发还是正式发布项目,POLY 系列都能提供高效、风格统一的解决方案。

2403_88403568的博客 633

union 共用体的使用

union 共用体名{                           数据类型 成员名;                           数据类型 成员名;                         ...                     } 变量名; 共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所

firefoxbug的专栏 1623

时间序列—显著相关性和滞后性分析_python

本文讲述了两个时间序列(信号)的相关性分析,可以利用相关性分析进行特征筛选。此外本文还讲了怎么判断时间序列的滞后性的方法。

qq_34229228的博客 2万+

银行业数据科学家的 6 条经验教训

原本希望在计算机科学、统计学和机器学习领域工作。运用新方法获得独特见解,实现一切自动化。简而言之,最终成了这个职业炒作的牺牲品。我想和你们分享一下。希望我们能够摆脱炒作,提高你对数据科学家工作的理解。

茶桁专栏 246

C++中union的使用

C++中union的使用

网络资源是无限的 5846

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

union的0x3个妙用(II)

2.union巧妙地实现多字节数据类型之间的转化在涉及音视频编解码算法中,经常会涉及一些数据压缩、声音解码、图象的缩放等问题。这里通过一个例子来推荐一种union绝妙用法(这种方法由Equator公司提供,在我们公司的图象处理算法中用得很多)。在该例子中,利用union结构n64u实现占8个字节n64类型与单字节的c0~c7的相互转换,从而达到数据压缩和分解的目的。 #include

嵌入式软件 1293

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

union理解与妙用

最近在看PCL中关于自定义PointT类型的文档,发现其中广泛使用了union,以前学习的时候用不到这个,也就没有留心,借此机会学习下union的使用方法,理解下union的本质。一 struct和union内存结构我们先来简单看下struct的内存结构,如下定义一个结构体:struct student { char mark; long num; float score;

Linear_Luo的专栏 4341

C语言之联合(union)的妙用

相信学过C语言的程序员对C语言的各种数据类型都非常熟悉,像数组、结构体、结构体数组、结构体指针这些数据类型大家都会信手捏来。然而,有些数据类型被我们不经意的边缘化了。它们没有数组、结构体这些数据类型用的广泛,但是却不容忽视,例如,枚举、联合等。   今天我们就讨论一下union(联合)这个数据类型。C语言的发明者为什么要弄一个这种不常用甚至几乎不用的数据类型呢。下面给你答案。首先,看一下unio...

debugzzj的博客 4万+

sql union的简单使用

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 用法: SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; 注意事项: UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。 同时,每个 SELECT 语句中的列的顺序必须相同。 UNION ...

背着梦的幸存者 1万+

c++ Union之妙用

union的作用基本是它里面的变量都用了同一块内存,跟起了别名一样,类型不一样的别名。

m0_46499080的博客 507

union妙用

试题一:编写一段程序判断系统中的CPU是Little endian还是Big endian模式?分析:作为一个计算机相关专业的人,我们应该在计算机组成中都学习过什么叫Little endian和Big endian。Little endian和Big endian是CPU存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址到高地址

Make Progress Everyday! 648

union的妙用

union的妙用 标签(空格分隔): 文章 作者github:smilesometimes 1 union 介绍 完全就是共用一个内存首地址,并且各种变量名都可以同时使用,操作也是共同生效。union的内存分配是按内存占用最大的变量分配的。 2 判断本机采用大端还是小端表示法 //本机小端返回0大端返回1, //intel cpu一般采...

weixin_34228617的博客 171

C/C++语言中联合体union的妙用

联合体union的基本概念 在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int、一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元中,这3个变量虽然在内存中占的字节数不同,但都从同一地址开始,使用覆盖技术,后一个数据覆盖了前面的数据。这便是联合体union(或者叫共用体)诞生的目的所在。其主要特点是: union中可以定义多...

Qsir的专栏 2174

联合体union在立体几何中的妙用

<!-- @page {margin:2cm} pre {font-family:"DejaVu Sans Mono",monospace} p.我的格式-western {font-family:"DejaVu Sans",sans-serif; font-size:10pt} p.我的格式-cjk {font-size:10pt} p.我的格式-ctl {fo

开发游戏,辉煌全中国 2187

在实际应用中联合体union的妙用

联合体union的概念定义,使用技巧,使用场景,注意要点。

大道至简,求同存异 1131

MySQL 8.0-13.2.10.3 UNION Clause

SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...] UNION combines the result from multipleSELECTstatements into a single result set. Example: UNION将多个SELECT语句的结果组合为一个结果集。例子: mysql> SELECT 1, 2; +---+---+ | 1 | 2 | +-...

tangwenqiang177的专栏 444

union在嵌入式编程中的3个妙用

 在嵌入式系统中,一般不建议使用union结构,因为union结构中的各个成员之间存在相互影响,容易滋生问题。可见,union也是把双刃剑。懂得使用它的人可以做到“削铁如泥”,而不懂得使用它的人很可能会被其所伤。下面介绍的几种方法都是嵌入式系统常用的几种技巧。如果熟练掌握,将来定有所用。  1. all的使用  使用all的数据结构模型:typedef _my_union

bird67的专栏 1190
上一篇: union的0x3个妙用(II)
下一篇: 一个计算机高手的成长
embeddedsoft
博客等级 码龄20年 51粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值