8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

union定义

“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。

“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

栗子如下:

123456union Foo

{

char character;

char *str;

double number;

};

一个union只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double类型,所以Foo的空间大小就是double数据类型的大小。

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

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

下面再看一个例子:

12345678910111213union var{

char c[4];

int i;

};

int main(){

union var data;

data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~ data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比 data.c[2] = 0x02;

data.c[3] = 0x11;//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。 printf("%xn",data.i);

}

data.i的值应该为多少呢?

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

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

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

union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的访问都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的访问都是从union 的首地址位置开始。如此一解释,上面的问题是否已经有了答案呢?

我的Mac系统打印的是 11020304 ,说明是小端模式。。

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

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

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

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

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

变量i占4 个字节,但只有一个字节的值为1,另外三个字节的值都为0。如果取出低地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是小端模式。既然如此,我们完全可以利用union类型数据的特点:所有成员的起始地址一致。

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

12345678910int checkSystem( )

{

union check

{

int i;

char ch;

} c;

c.i = 1;

return (c.ch == 1);

}

总结

union同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址,它所占的空间等于其最大的成员所占的空间,机器的大小端存储影响union成员的取值。

确认系统存储模式C语言,关于C语言中的union相关推荐

  1. c语言4钟存储类型关键字用法,求C语言中的32个关键字及其意思? C语言中32个关键字的意思和用法~!...

    C语言中的32个关键字及其意思如下: 1.auto    声明自动变量 2.short    声明短整型变量或函数 3.int    声明整型变量或函数 4.long    声明长整型变量或函数 5. ...

  2. 【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符的作用、C语言中的 联合体

    本章目录: 1. c语言中%x.%c.%d.%x等等等 2. c语言取地址符&的作用 3. 了解 C语言中的 联合体 3.1 什么是联合体? 3.2 定义 3.2.1 举例 3.3 初始化联合 ...

  3. Go语言编程—Go语言中JSON的处理(map、struct 和 JSON字符串的相互转换)

    JSON的简单介绍 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaSc ...

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

    共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量. 在union中,全部的共用体成员共用一个空间. 而且同一时间仅仅能储存当中一个成员变量的值. 1.union中能够 ...

  5. [R语言]1. R语言中R包下载存储位置和安装位置

    开发环境:Win7+R3.6.2+RStudio R语言学习中R包的安装必不可少,可能很多人都没有深究R包是怎么安装的,只是用install.packages("xx包名")命令来 ...

  6. java语言基础final_java语言中final的用法

    许多程序设计语言都有自己的办法告诉编译器某个数据是"常数".常数主要应用于下述两个方面: (1) 编译期常数,它永远不会改变 (2) 在运行期初始化的一个值,我们不希望它发生变化 ...

  7. c语言%m,C语言中rand()%m是啥意思?

    rand()%m这个函数是随机产生0到m-1的随机数:比如rand()%10就是随机产生0到9的随机数. 拓展资料 使用C语言的rand函数,生成的是伪随机数: c语言之rand函数的使用 1.写入头 ...

  8. datatype c语言自定义,C语言中的datatype是什么

    datatype是数据类型.C的数据类型包括:整型.字符型.实型或浮点型(单精度和双精度).枚举类型.数组类型.结构体类型.共用体类型.指针类型和空类型. 数据类型关键字: 1.short:修饰int ...

  9. go语言io reader_Go语言中的io.Reader和io.Writer以及它们的实现

    在使用Go语言的过程中,无论你是实现web应用程序,还是控制台输入输出,又或者是网络操作,不可避免的会遇到IO操作,使用到io.Reader和io.Writer接口.也也许对这两个接口和相关的一些接口 ...

最新文章

  1. CSS中关于margin的理解误区
  2. 3.innodb内存结构
  3. 模板匹配—归一化相关系数匹配算法
  4. Zookeeper分布式一致性原理(十一):Zookeeper在JStorm中应用
  5. 在线post测试java接口测试_好用的在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具-ApiPost...
  6. TcpClient和TcpListener 类的使用-编写一个点对点聊天工具(初级入门篇)
  7. 边写 Javascript 代码边玩游戏 – WarriorJS
  8. 近24小时以太坊上的DEX交易量超过150亿美元
  9. python和ui设计哪个更好_Python主流IDE对比:Eric VS. PyCharm
  10. 异常 Failed to instantiate [java.util.List]: Specified class is an interface
  11. macOS Big Sur系统Parallels Desktop无法启动的解决办法
  12. Ubuntu 安装 gcc-4.8
  13. python设置excel套打_你不一定知道这个用 Python 快速设置 Excel 表格边框的技巧
  14. windows资源管理器对文件右键未响应!电脑小白求救[哭唧唧]!!!
  15. Play框架最快上手!
  16. java web QQ(三)
  17. 计算机毕业设计 SSM汽车维修保养平台 汽车维修维护平台 汽车信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  18. usb接口驱动_UART串行总线舵机转接板规格、接线说明 amp; 驱动安装
  19. BIM的真正基础是模型质量!
  20. mysql多实例的安装和管理(一台服务器上运行两个mysql实例)

热门文章

  1. 蓝牙怎么区分单模和双模_小院闲聊#01#——蓝牙的发展和不同蓝牙之间的关系...
  2. 还是畅通工程(prim和kruskal)
  3. Python标准库中的io
  4. VirtualBox虚拟机如何扩容
  5. springboot获取静态图片路径_springboot为实体追加图片路径
  6. JAVA字符串功能,Java分析字符串功能
  7. java 定时调度_怎么编写一个定时调度java程序
  8. 关于python的垃圾回收机制_Python中的垃圾回收机制
  9. Win10设置防火墙,使局域网能访问此电脑的Tomcat服务
  10. mysql 杀掉会话