Union -- 公用体判断大小端模式
2016-01-21 15:15
281 查看
通过使用union可以知道自己所用的编译器是大端模式还是小端模式。
例1:
.号的优先级高于&运算符,所以加不加括号都是一个效果。
上面的&U.ch和&(U.ch)是等效的。
例2:
输出结果显示:
解析:
通过输出结果可以看出:
1)在结构体内部,元素的地址是连续的。
比如:struct sch中ch1,ch2,ch3,ch4的地址分别是:18920284,18920285,18920286,18920287.(四个都是char型,相差1 byte)
struct sint中j,m的地址分别是:18920284,18920288.(两个都是int型,相差4 bytes)
2)union内部的地址,i,m,ch1的地址是相同的,最先定义的对齐。
3)大小端问题:
低地址存低字节,高地址存高字节是小端模式。反之,是大端模式。
struct sch中有4个char型的变量,内存地址分别对应i的int型地址。
本例中ch1是低地址,对应i的0x78低字节的值,所以是小端模式。
例1:
#include<iostream> using namespace std; union un { char ch; int num; }U; int main() { U.num = 0x1; if(U.ch == 1) { printf("小端模式。\n"); } else if(U.ch == 0) { printf("大端模式。\n"); } //输出地址看一下 cout<<"The address of U is 0x"<<hex<<&U<<endl; cout<<"The address of U.ch is 0x"<<hex<<(int)(char*)&U.ch<<endl; cout<<"The address of U.num is 0x"<<hex<<(int)(int*)&U.num<<endl; system("pause"); return 0; }
.号的优先级高于&运算符,所以加不加括号都是一个效果。
上面的&U.ch和&(U.ch)是等效的。
例2:
union { int i; struct { int j; int m; }sint; struct { char ch1; char ch2; char ch3; char ch4; }sch; }un; int main() { un.i=0x12345678; printf("The size of un is:%d\n",sizeof(un)); printf("sint中j的值:%x\n",un.sint.j);//i和j对应 printf("sint中m的值:%x\n",un.sint.m); printf("sch中ch1的值:0x%x\n",un.sch.ch1); printf("sch中ch2的值:0x%x\n",un.sch.ch2); printf("sch中ch3的值:0x%x\n",un.sch.ch3); printf("sch中ch4的值:0x%x\n",un.sch.ch4); printf("i的地址是:%d\n",(int)(int*)&un.i); printf("sint中j的地址是:%d\n",(int)(int*)&un.sint.j); printf("sint中m的地址是:%d\n",(int)(int*)&un.sint.m); printf("sch中ch1的地址是:%d\n",(int)(int*)&un.sch.ch1); printf("sch中ch2的地址是:%d\n",(int)(int*)&un.sch.ch2); printf("sch中ch3的地址是:%d\n",(int)(int*)&un.sch.ch3); printf("sch中ch4的地址是:%d\n",(int)(int*)&un.sch.ch4); system("pause"); }
输出结果显示:
解析:
通过输出结果可以看出:
1)在结构体内部,元素的地址是连续的。
比如:struct sch中ch1,ch2,ch3,ch4的地址分别是:18920284,18920285,18920286,18920287.(四个都是char型,相差1 byte)
struct sint中j,m的地址分别是:18920284,18920288.(两个都是int型,相差4 bytes)
2)union内部的地址,i,m,ch1的地址是相同的,最先定义的对齐。
3)大小端问题:
低地址存低字节,高地址存高字节是小端模式。反之,是大端模式。
struct sch中有4个char型的变量,内存地址分别对应i的int型地址。
本例中ch1是低地址,对应i的0x78低字节的值,所以是小端模式。
相关文章推荐
- SQL学习笔记六 union联合结果集使用
- SQL语句的并集UNION 交集JOIN(内连接,外连接)等介绍
- SQLSERVER中union,cube,rollup,cumpute运算符使用说明
- union组合结果集时的order问题
- 数据库中union 与union all 的区别
- 深入SQL SERVER合并相关操作Union,Except,Intersect的详解
- MySQL union 语法代码示例分析
- sql Union和Union All的使用方法
- union这个连接是有什么用的和INNER JOIN有什么区别
- C++联合体union用法实例详解
- C语言、C++中的union用法总结
- MySQL中使用自定义变量 编写偷懒的UNION示例
- 详解MySQL中UNION的用法
- MySQL中使用or、in与union all在查询命令下的效率对比
- MySQL中union和join语句使用区别的辨析教程
- SQL中JOIN和UNION区别、用法及示例介绍
- Mysql联合查询UNION和UNION ALL的使用介绍
- Oracle中Union与Union All的区别(适用多个数据库)
- UNION ALL 和 ORDER BY NEWID 一起使用
- UNION 与 UNION ALL