Daily-C-Study(3):C语言union关键字

C 语言中的 union 由于 C 语言是强类型语言,不能如同某些语言一样,可以在变量中存储任意元素。所以在有的时候会遇到一些问题。比如你有一个变量需要存储计算结果,计算结果有时可能是整数,有时可能是浮点数。这里我们介绍其中可以做到不更改变量名就可以存储不同类型数据的变量。 阅读详情

Daily-C-Study(3):C语言union关键字

成于坚持,败于止步

union 关键字的用法与struct 的用法非常类似,但也有很大的不同。

union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。例子如下:

union StateMachine
{
char character;
int number;
char *str;
double exp;
};
一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double 型态,所以StateMachine 的空间大小就是double 数据类型的大小。

在C++里,union 的成员默认属性页为public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。

大小端模式对union 类型数据的影响

下面再看一个例子:

union
{
int i;
char a[2];
}*p, u;
p =&u;
p->a[0] = 0x1;
p->a[1] = 0x2;
p.i 的值应该为多少呢?

这里需要考虑存储模式:大端模式和小端模式。

  1. 大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

  2. 小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。

如何用程序确认当前系统的存储模式?

上述问题似乎还比较简单,那来个有技术含量的:请写一个C 函数,若处理器是Big_endian 的,则返回0;若是Little_endian 的,则返回1。

先分析一下,按照上面关于大小端模式的定义,假设int 类型变量i 被初始化为1。

以大端模式存储,其内存布局如下图:

以小端模式存储,其内存布局如下图:

变量i 占4 个字节,但只有一个字节的值为1,另外三个字节的值都为0。如果取出低地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是小端模式。

既然如此,我们完全可以利用union 类型数据的特点:所有成员的起始地址一致。

到现在,应该知道怎么写了吧?参考答案如下:

int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
现在你可以用这个函数来测试你当前系统的存储模式了。当然你也可以不用函数而直接去查看内存来确定当前系统的存储模式。如下图:

图中0x01 的值存在低地址上,说明当前系统为小端模式。

不过要说明的一点是,某些系统可能同时支持这两种存储模式,你可以用硬件跳线或在编译器的选项中设置其存储模式。

留个问题:在x86 系统下,输出的值为多少?

#include<stdio.h>
int main()
{
int a[9]={1,2,3,4,5,6,7,8,9};
intptr1=(int)(&a+1);
intptr2=(int)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
可以告诉大家的是答案是:

9,2000000

问题来,为什么是9和2000000 。这个答案估计是没有人能够料想得到的吧!如果你以前从来没有看过这个问题,现在一眼就看出这个问题的答案的话,那么你就是传说中顶尖高手中的高手,C语言已经达到如火纯青的地步。 难得的人才啊!其实这里有很多的问题需要解决,这不是一道普通的C语言的题目,而是一题高级的C语言题目,它涉及的知识面都让我震惊。这个输出的结果会让很多写过C语言的同学感到困惑不已!

ptr1[-1]= (ptr1 - 1) 由于ptr1是指针,指向数组a后面的下一个元素,而ptr1-1就是ptr1这个指针往前移动一个单位,移动之后这个指针指向了数组a的最后一个元素。所以就有(ptr1-1)=9。这个还算好理解,重点是下面那一条命令比较纠结啊

对于ptr2而言,a是数组首元素的首地址,(int)a即把这个地址强制转换为int型数据,然后(int)a+1很简单,就是int型数据的相加。(int*)((int)a+1)就是再把这个int型的数据再强制型转换为int类型的指针,最后再把这个指针赋给int型的ptr2指针,并且将其打印成十六进制的形式。 因为我们的pc机采用的小端存储(这个很重要)这个时候,

数组a的内存布局(16进制):01000000 02000000 03000000 04000000 05000000 06000000 07000000 08000000 09000000

而 (int)a+1是向后移动了一个字节,即000000 02 由于是小端的方式,且以16进制的形式显示,所以就有了2000000的值出来

不知道你有没有看得懂我上面说到那么一通,O(∩_∩)O~

就先到这里,O(∩_∩)O~

我的专栏地址:http://blog.youkuaiyun.com/column/details/c-daily-study.html

待续。。。。。。

作者:Ela–学海无涯
来源:优快云
原文:https://blog.youkuaiyun.com/xinyuwuxian/article/details/8990723
版权声明:本文为博主原创文章,转载请附上博文链接!

C语言中的union用法 阅读详情

相关推荐

ABAP调用启信宝API

方法参数定义如下 源代码如下 method qxb_http_get. data:lv_url type string. "===============初始化=============================================== "获取http实例 cl_http_client=>create_by_destination( exporting destination = space importing

u012232542的博客 1311

联合体union

C语言学习

weixin_53070140的博客 1363

mcgs数据查表功能,用于大量数据对比查找对应数据,减少PLC代码

mcgs脚本实现数据查表功能

qq_24866535的博客 3271

C union使用

#include union { int i; char x[2]; }a; int main() { a.x[0] = 10; a.x[1] = 1; printf("%d",a.i); return 0; }公用体公用一个内存区域sizeof(a)为共用体成员中长度最长的成员的size。即iint: (|_|_|_|_

sxwdj521的博客 593

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析

本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。

weixin_29070861的博客 478

测站坐标系、地心非惯性系、经纬高互转

目录 一、经纬高转直角坐标系互转 1.1 python代码 二、wgs84转cgcs2000的转换矩阵如下 虽然cgcs2000与wgs84差别很小,但是我比较较真,还是做了两个坐标系的转换。 一、经纬高转直角坐标系互转 此处可参考链接(百度文库用手机浏览器可以打开看全部的): (1)第四章地球椭球及其数学详解 (2)第四章椭球数学变换16节 (3)大地测量学基础[1](7)(控制) 转换公式如下: LBH转XYZ: a为半长轴,e为偏心率 XYZ转LBH: a为半长轴

${王小贱}的博客 2万+

C语言的联合(union)介绍

“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。如前面介绍的“单位”变量, 如定义为一

阿泰 1379

优雅谈大模型:“System2”与“System 1”

研究人员探索了三种System 2方法——RaR、S2A 和 BSM,这些方法已经成功提炼到新的LLM,这个新的模型与System 1相比,产生了更好的结果,而且成本低于System 2。然而这种方法是有局限性,只能适用于特定的任务。

鲁班模锤 5159

多层联合体(union)的初始化赋值

在C语言中,多层联合体(union)的初始化赋值可以通过直接初始化嵌套的联合体实现。联合体是一种特殊的数据类型,它能够存储不同的数据类型,但同一时间只能存储其中一个数据类型的值。初始化时,我们使用了结构体样式的初始化(designated initializer)来指定初始化。这样可以避免可能的混淆和歧义。注意,联合体的大小由其最大成员的大小决定,所以在这个例子中,都被正确地设置了,尽管它们分别属于不同的数据类型。联合体,并且给它的嵌套联合体。包含了整型和字符型成员。函数中,我们初始化了。

qq_24846887的博客 1244

搭建Java集成开发环境IntelliJ IDEA

package net.huawei.p01.t02;/** * 功能:输出一条信息 * 作者:华卫 * 日期:2022年03月24日 */ public class HelloWorld { public static void main(String[] args) { // arguments System.out.println("Hello Java World~"); } }

qq_67308063的博客 476

ESP32-C3入门教程 环境篇②——Windows开发环境准备

文章目录一、注意事项二、下载ESP-IDF工具安装器三、安装内容四、详细安装步骤报错处理 一、注意事项 请注意 ESP-IDF 和 ESP-IDF 工具的安装路径不能超过 90 个字符,安装路径过长可能会导致构建失败。 Python 或 ESP-IDF 的安装路径中一定不能包含空格或括号。 除非操作系统配置为支持 Unicode UTF-8,否则 Python 或 ESP-IDF 的安装路径中也不能包括特殊字符(非 ASCII 码字符、中文字符) 二、下载ESP-IDF工具安装器 ESP-IDF Win

5244

Daily-C-Study(10):C语言关键字有哪些

Daily-C-Study(10):C语言关键字有哪些 成于坚持,败于止步 C 语言标准定义的32 个关键字: auto 声明自动变量,缺省时编译器一般默认为auto int 声明整型变量 double 声明双精度变量 long 声明长整型变量 char 声明字符型变量 float 声明浮点型变量 short 声明短整型变量 signed 声明有符号类型变量 unsigned 声明无符号类型变量 ...

Ryze的博客 182

三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解

三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解

Robot_PLC_HMI_Automation 1万+

c语言中如何正确使用union,C语言中的union使用方法

共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,全部的共用体成员共用一个空间。而且同一时间仅仅能储存当中一个成员变量的值。1、union中能够定义多个成员。 union的大小由最大的成员的大小决定。2、union成员共享同一块大小的内存, 一次仅仅能使用当中的一个成员。3、对某一个成员赋值,会覆盖其它成员的值(由于他们共享一块内存。但前提是成员所...

weixin_39626409的博客 2660

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c语言共用体变量赋值,(C语言)共用体union的用法举例

以前在学校学习C语言的时候一直搞不懂那个共用体union有什么用的。工作之后才发现它的一些妙用,现举例如下:1. 为了方便看懂代码。比如说想写一个3 * 3的矩阵,可以这样写:[ 注:下面用红色部分标记的地方是后来添加上去的,谢谢yrqing718的提醒!]struct Matrix{union{struct{float _f11,_f12,_f13,_f21,_f22,_f23,...

weixin_26821003的博客 3166

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c和c++区别(一)——默认值、inline、cosnt和引用

一、带有默认值的函数 1、c的版本    c:c89(我们现在使用的版本,不支持默认值)、c99(可以支持默认值)、c11(2011年发行的版本) 2、c++版本       c++:c89          c++99(我们现在使用的版本,支持默认值)   c++11   3、代码示例 1)int sum(int a, int b);      int sum(int a,

Betty2017的博客 569

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言中的Union(共用体)

在C语言中,Union(共用体)是一种特殊的数据结构,它允许你在一个单独的内存空间中存储不同的数据类型。与Struct(结构体)相似,Union可以包含多种不同类型的成员,但与Struct不同的是,Union的成员共享同一块内存区域。这意味着任何时候,Union只存储一个成员的值,即使定义了多个成员。这种特性使得Union在处理需要节省空间或实现类型灵活转换的场景时非常有用。

宁子希的博客 2111

C语言菜鸟入门·关键字·union的用法

共用体(union)是一种数据结构,它允许在同一内存位置存储不同的数据类型,但每次只能存储其中一种类型的数据。与结构体不同,结构体中的每个成员都有各自独立的内存空间,而共用体中的所有成员共享同一块内存区域。

时光の尘的博客 3288

C语言-union学习

这里写自定义目录标题union属性定义方式测试给union赋值应用场景 union属性 union叫做联合体,共用体。其精髓在于内部定义的数据结构共用一块内存,大小与最大的数据结构对齐。 定义方式 union BmsData_uno { u8 u8RecData[17]; __packed struct { float Voltage; //电池电压 float ...

weixin_43482414的博客 494

C语言详细笔记--构造数据类型(共用体)

和结构体一样,共用体变量的定义也有三种形式1.先声明共用体类型再定义共用体变量float b;char c[3];2.再声明共用体类型的同时定义共用体变量float b;char c[3];}x;3.不指定共用体名而直接定义共用体变量union {float b;char c[3];}x;说明:1.系统为共用体变量中的所有成员分配以同一地址开始的存储空间,使用覆盖技术共享存储单元。共享存储单元示意图2.

Jasmine5606的博客 1252

大学C语言字符串题目,[转载]大学C语言考试题精选

一. 填空题(每题2分,共20分)1. C语言基本数据类型有:_______________________________;构造类型有:_____________________________________。 P.132.C语言源程序注注释符号是:________________________________,为表明层次结构,C语言源程序通常采用_____________________格...

weixin_35455135的博客 874

C语言union(联合体 共用体)

一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住。这次看书又看到了,还是学习一下吧。 一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂。本质上来说和结构体是一样的,但是从包装的角度来看有差异。 1、union中可以定义多个成员,union的大小由最大的成员的大小决定。 2、union成员共享同一块大小的内存,一次只能使用其中的一个成员

sunchaosailor的专栏 1069

c语言关键字大全和union关键字

union关键字 大家一起加油!~ 文章目录union关键字前言(关键字大全)一、union是什么?二、共用体和结构体的区别总结-为什么要用Union 前言(关键字大全) 前情提示:C语言有许多关键字,以下是列出的关键字: auto //声明自动变量 break //跳出当前循环 case //开关语句分支 char //声明字符型变量或函数返回值类型 const //声明只读变量 continue //结束当前循环,开始下一轮循环 default //开关语句中的“默认”分支 do //循环语句的循环

qq_43614246的博客 482

C语言:关键字---union(声明共用体类型)

C语言32个关键字 有32个关键字详细说明,还有跳转链接!union 是C语言中一种声明共用体的数据类型。 union(共用体)在某种程度上类似struct(结构体)的一种数据结构,可以包含很多数据结构和变量。 union(共用体)的特点:其内部的数据 共用一个内存首地址,共享同一段内存,以达到节省空间的目的。一般形式具体如下: 举例说明如下: 2. 定义共用体变量 一般形式具体如下: 合并简化形式具体如下: 匿名结构体形式具体如下: 3. 使用 typedef 声明共用体类型,再定义共用体变量 一般形式如

MQ0522的博客 3万+
上一篇: Daily-C-Study(2):C语言enum关键字
下一篇: Daily-C-Study(4):C语言struct关键字
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值