判断系统大小端方法分析与总结
情况1:利用数组类型
- #include <cstdio>
- int checkSystem()
- {
- char s[]="1000";
- return (s[0]=='1');
- }
- int main()
- {
- checkSystem()==1 ? printf("Little-endian/n") : printf("Big-endian/n");
- return 0;
- }
情况2:利用位移运算
- int i = 1;
- if(1>>32 == 0)
- cout<<"小端模式"<<endl;
- else
- cout<<" 大端模式"<<endl;
上述方法正确吗?要理解为什么不正确?
因为不要在数值上做文章,而大小端是严格与内存挂钩的东西。如果int a=1; 那么a&1==1一定成立,因为这是从数值角度运算的,已经给用户屏蔽掉了大小端的问题。一定要int a=1; *((char*)(&a)) == 1 ,这样判断才有效。
下面总结一些有效的方法。
方法1:利用union类型 —— 可以利用union类型数据的特点:所有成员的起始地址一致。
- #include <cstdio>
- int checkSystem()
- {
- union check
- {
- int i;
- char ch;
- }c;
- c.i=1;
- return (c.ch==1);
- }
- int main()
- {
- checkSystem()==1 ? printf("Little-endian/n") : printf("Big-endian/n");
- return 0;
- }
方法2:对int强制类型转换
- #include<stdio.h>
- #include<stdlib.h>
- int main()
- {
- int i = 1;
- (*(char *)&i == 1) ? printf("Little-endian/n") : printf("Big-endian/n");
- system("pause");
- return 0;
- }
方法3:使用union和宏定义
- #include<stdio.h>
- #include<stdlib.h>
- static union
- {
- char a[4];
- unsigned long ul;
- }endian = {{'L', '?', '?', 'B'}};
- #define ENDIAN ((char)endian.ul)
- int main()
- {
- printf("%c/n", ENDIAN);
- system("pause");
- return 0;
- }
补充:
大小端模式对union类型数据的影响。
- #include <cstdio>
- union
- {
- int i;
- char a[2];
- }*p, u;
- int main()
- {
- p=&u;
- p->a[0]=0x39;
- p->a[1]=0x38;
- printf("%x/n",p->i);// 3839 (hex.)
- printf("%d/n",p->i);// 111000 00111001=14393 (decimal)
- return 0;
- }
分析如下图所示:
高地址 低地址
—— —— —— —— int
0 | 0 | 56 | 57
—— —— —— ——
—— —— char
56 | 57
—— ——
这里需要考虑存储模式:大端模式和小端模式。
大端模式(Big-endian):数据的低字节存放在高地址中。
小端模式(Little-endian):数据的低字节存放在低地址中。
union型数据所占的空间等于其最大的成员所占的空间,对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,即,联合体的访问不论对哪个变量的存取都是从union的首地址位置开始。因此,上面程序输出的结果就显而易见了。
本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/3859761.html,如需转载请自行联系原作者
判断系统大小端方法分析与总结相关推荐
- 最简单判断系统大小端
大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端.(CPU对操作数的存放方式是从高字节到低字节) 小端:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端.(CPU对操作数的存 ...
- C++ 判断系统大小字节序
bool IsLitterEndian() {union UTest{std::uint16_t t;std::uint8_t c;} endianTest{ 0x01 };return (endia ...
- 818专业课【考经】—《信号系统》之章节概要:第九章 系统的状态变量分析法
本人介绍 -1- 本硕均就读于南京理工大学.本科专业为电子信息工程,硕士专业为信号与信息处理. -2- 2021级研究生,初试专业课分数142分,在所报考专业内专业课成绩排名第一. -3- 有辅导81 ...
- 五步移相法matlab程序_用MATLAB软件对逆变电路移相调压进行仿真,30°,60°,90°的波形,并用分段分析法分析其原理_学小易找答案...
[简答题]Translate the following ad into (1) a TV comercial, and (2) a factual introduction. Marie Franc ...
- Linux系统下常见性能分析工具的使用
在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...
- linux 性能教程,Linux系统下常见性能分析工具的使用
在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...
- 分析linux系统的运行性能,Linux系统下常见性能分析工具的使用
在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...
- Android日志系统Logcat源代码简要分析
在前面两篇文章Android日志系统驱动程序Logger源代码分析和Android应用程序框架层和系统运行库层日志系统源代码中,介绍了Android内核空间层.系统运行库层和应用程序框架层日志系统相关 ...
- 射频毫米波芯片设计11:基于奇偶模法分析设计射频微波Wilkinson功分器
<射频微波芯片设计>专栏适用于具备一定微波基础知识的高校学生.在职射频工程师.高校研究所研究人员,通过本系列文章掌握射频到毫米波的芯片设计流程,设计方法,设计要点以及最新的射频/毫米波前端 ...
最新文章
- SSH,SCP,SFTP命令汇总
- 【SD】自定义销售订单审批状态
- 计算机隐藏用户设置,在开始屏幕(欢迎屏幕、控制面板的用户账户设置)上隐藏用户账户和开机自动登录某个账户...
- 信息安全不可错过的30门实验
- 用java进行LDAP用户登陆(用户认证)及修改密码
- LinkedList源码学习
- python scheduler 定时执行_python使用apscheduler做定时任务的管理
- 怎么用U盘重装系统?
- mooon db wrapper
- Python Imaging Library: ImageWin Module(图像Windows模块)
- 多元统计分析基于r课后答案_(完整版)多元统计分析课后练习答案
- 文件服务器挂在网上,(6)NAS简述 - 服务器 【已迁移到IXPUB】 - ITPUB论坛-专业的IT技术社区...
- iOS证书(.p12)和描述文件(.mobileprovision)申请
- AI算法工程师必知必会的mysql语法
- x64dbg安装xAnalyzer插件失败问题解决
- c 语言 时间间隔(多实例测试)
- windows如何设置默认“大图标”显示
- AngularJS 表达式
- 怎样将PDF转成EXCEL
- IPFS系列 - 默克有向无环图(Merkle DAG)