编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

C++|联合体应用:大、小端,高、低字节及用共用体作结构体成员

gowuye 2024-04-25 04:41 1 浏览 0 评论

复合数据类型是用基本数据类型定义的数据类型。

联合可以保存单个值,但它可以是多种类型,成员名称指示正在使用的模式。

联合体是不同数据类型共享同一内存空间,共用体类型数据的特点:

(1) 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。

(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。

(3) 共用体变量的地址和它的各成员的地址都是同一地址。

联合体在特定的场合下特别有用:

1 大端还是小端?

在计算机业界,Endian表示数据在存储器中的存放顺序。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

小端:高字节在高地址, 低字节在低地址;

大端:高字节在低地址, 低字节在高地址;

#include <iostream>
using namespace std;
void Endian()
{
	union Endia
	{
		unsigned short cc;
		unsigned char c;
	}endia;
	endia.cc=0x1234;
	cout<<"本机的内存数据排列顺序为:";
	if(endia.c)
		cout<<"先低后高,char c="<<hex<<(unsigned int)endia.c<<endl;
	else if(!endia.c)
		cout<<"先高后低"<<endl;
}
bool IsBig_Endian()
//如果字节序为big-endian,返回true;
//反之为 little-endian,返回false
{
 unsigned short test = 0x1122;
 if(*((unsigned char*) &test ) == 0x11)
		return true;
	else
		return false;
	
}//IsBig_Endian()

void main()
{
	
	Endian();


	if(IsBig_Endian())
		cout<<"big endian"<<endl;
	else
		cout<<"little endian"<<endl;
	cin.ignore();
}
/*
本机的内存数据排列顺序为:先低后高,char c=34
little endian
*/

Compaq公司的一部分和Intel的机器(X86平台)一般采用小端。

IBM、Motorola(Power PC), Sun的机器一般采用大端。

当然,这不代表所有情况。有的CPU既能工作于小端, 又能工作于大端, 比如ARM、Alpha、摩托罗拉的PowerPC。具体这类CPU是大端还是小端,应该和具体设置有关。如Power PC支持little-endian字节序,但在默认配置时是big-endian字节序。

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。

Little Endian还是BigEndian与操作系统和芯片类型都有关系。

为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用bigendian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?

无独有偶,所有网络协议也都是采用bigendian的方式来传输数据的。所以有时我们也会把bigendian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

2 低字节与高字节

对于一个整数(多字节)可以按单字节来读取,如unsigned short可以分成两个unsigned char来操作:

#include <iostream>
using namespace std;
typedef struct
{
	unsigned char low;		// 低字节
	unsigned char high;		// 高节节
}Wtag;
union Val
{
	Wtag bytea;				//高、低字节
	unsigned short worda;	// 整个数据值
}val;
void main()
{
	val.worda=0x1234;
	cout<<"整字数据值:"<<hex<<(unsigned short)val.worda<<endl;		//查看val的高字节
	cout<<"低字节数据值"<<hex<<(unsigned short)val.bytea.low<<endl;	//查看val的低字节
	cout<<"高字节数据值"<<hex<<(unsigned short)val.bytea.high<<endl;//查看val的高字节
	val.bytea.low=0x56;
	val.bytea.high=0x78;
	cout<<"修改后的整字数据值"<<hex<<(unsigned short)val.worda<<endl;//查看val的高字节
	
 system("pause");
}
/*
整字数据值:1234
低字节数据值34
高字节数据值12
修改后的整字数据值7856
*/

3 用共用体作结构体成员

例如,设有若干个人员的数据,其中有学生和教师。

学生:姓名、号码、性别、职业、班级。

教师:姓名、号码、性别、职业、职务。

学生和教师的数据分量只有班级和职务的差别,为此可以定义一个相同的结构体,其中用一个共用体来表示班级和职务的差别:

struct
{
int num;
char name[10];
char sex;
char job;
union
{
int banji;
char position[10];
}category;
}person[2];/*先设人数为2*/

-End-

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: