情况1:利用数组类型

  1. #include <cstdio>
  2. int checkSystem()
  3. {
  4. char s[]="1000";
  5. return (s[0]=='1');
  6. }
  7. int main()
  8. {
  9. checkSystem()==1 ? printf("Little-endian/n") : printf("Big-endian/n");
  10. return 0;
  11. }

情况2:利用位移运算

  1. int i = 1;
  2. if(1>>32 == 0)
  3. cout<<"小端模式"<<endl;
  4. else
  5. cout<<" 大端模式"<<endl;

上述方法正确吗?要理解为什么不正确?

因为不要在数值上做文章,而大小端是严格与内存挂钩的东西。如果int a=1; 那么a&1==1一定成立,因为这是从数值角度运算的,已经给用户屏蔽掉了大小端的问题。一定要int a=1; *((char*)(&a)) == 1 ,这样判断才有效。

下面总结一些有效的方法。

方法1:利用union类型 —— 可以利用union类型数据的特点:所有成员的起始地址一致。

  1. #include <cstdio>
  2. int checkSystem()
  3. {
  4. union check
  5. {
  6. int i;
  7. char ch;
  8. }c;
  9. c.i=1;
  10. return (c.ch==1);
  11. }
  12. int main()
  13. {
  14. checkSystem()==1 ? printf("Little-endian/n") : printf("Big-endian/n");
  15. return 0;
  16. }

方法2:对int强制类型转换

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. int i = 1;
  6. (*(char *)&i == 1) ? printf("Little-endian/n") : printf("Big-endian/n");
  7. system("pause");
  8. return 0;
  9. }

方法3:使用union和宏定义

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. static union
  4. {
  5. char a[4];
  6. unsigned long ul;
  7. }endian = {{'L', '?', '?', 'B'}};
  8. #define ENDIAN ((char)endian.ul)
  9. int main()
  10. {
  11. printf("%c/n", ENDIAN);
  12. system("pause");
  13. return 0;
  14. }

补充: 
大小端模式对union类型数据的影响。

  1. #include <cstdio>
  2. union
  3. {
  4. int i;
  5. char a[2];
  6. }*p, u;
  7. int main()
  8. {
  9. p=&u;
  10. p->a[0]=0x39;
  11. p->a[1]=0x38;
  12. printf("%x/n",p->i);// 3839 (hex.)
  13. printf("%d/n",p->i);// 111000 00111001=14393 (decimal)
  14. return 0;
  15. }

分析如下图所示:
高地址        低地址
—— —— —— ——   int
0   |   0   |  56  |  57    
—— —— —— ——
               —— ——   char
                56  |   57
               —— ——      
这里需要考虑存储模式:大端模式和小端模式。
大端模式(Big-endian):数据的低字节存放在高地址中。
小端模式(Little-endian):数据的低字节存放在低地址中。
union型数据所占的空间等于其最大的成员所占的空间,对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,即,联合体的访问不论对哪个变量的存取都是从union的首地址位置开始。因此,上面程序输出的结果就显而易见了。

本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/3859761.html,如需转载请自行联系原作者

判断系统大小端方法分析与总结相关推荐

  1. 最简单判断系统大小端

    大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端.(CPU对操作数的存放方式是从高字节到低字节) 小端:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端.(CPU对操作数的存 ...

  2. C++ 判断系统大小字节序

    bool IsLitterEndian() {union UTest{std::uint16_t t;std::uint8_t c;} endianTest{ 0x01 };return (endia ...

  3. 818专业课【考经】—《信号系统》之章节概要:第九章 系统的状态变量分析法

    本人介绍 -1- 本硕均就读于南京理工大学.本科专业为电子信息工程,硕士专业为信号与信息处理. -2- 2021级研究生,初试专业课分数142分,在所报考专业内专业课成绩排名第一. -3- 有辅导81 ...

  4. 五步移相法matlab程序_用MATLAB软件对逆变电路移相调压进行仿真,30°,60°,90°的波形,并用分段分析法分析其原理_学小易找答案...

    [简答题]Translate the following ad into (1) a TV comercial, and (2) a factual introduction. Marie Franc ...

  5. Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  6. linux 性能教程,Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  7. 分析linux系统的运行性能,Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  8. Android日志系统Logcat源代码简要分析

    在前面两篇文章Android日志系统驱动程序Logger源代码分析和Android应用程序框架层和系统运行库层日志系统源代码中,介绍了Android内核空间层.系统运行库层和应用程序框架层日志系统相关 ...

  9. 射频毫米波芯片设计11:基于奇偶模法分析设计射频微波Wilkinson功分器

    <射频微波芯片设计>专栏适用于具备一定微波基础知识的高校学生.在职射频工程师.高校研究所研究人员,通过本系列文章掌握射频到毫米波的芯片设计流程,设计方法,设计要点以及最新的射频/毫米波前端 ...

最新文章

  1. SSH,SCP,SFTP命令汇总
  2. 【SD】自定义销售订单审批状态
  3. 计算机隐藏用户设置,在开始屏幕(欢迎屏幕、控制面板的用户账户设置)上隐藏用户账户和开机自动登录某个账户...
  4. 信息安全不可错过的30门实验
  5. 用java进行LDAP用户登陆(用户认证)及修改密码
  6. LinkedList源码学习
  7. python scheduler 定时执行_python使用apscheduler做定时任务的管理
  8. 怎么用U盘重装系统?
  9. mooon db wrapper
  10. Python Imaging Library: ImageWin Module(图像Windows模块)
  11. 多元统计分析基于r课后答案_(完整版)多元统计分析课后练习答案
  12. 文件服务器挂在网上,(6)NAS简述 - 服务器 【已迁移到IXPUB】 - ITPUB论坛-专业的IT技术社区...
  13. iOS证书(.p12)和描述文件(.mobileprovision)申请
  14. AI算法工程师必知必会的mysql语法
  15. x64dbg安装xAnalyzer插件失败问题解决
  16. c 语言 时间间隔(多实例测试)
  17. windows如何设置默认“大图标”显示
  18. AngularJS 表达式
  19. 怎样将PDF转成EXCEL
  20. IPFS系列 - 默克有向无环图(Merkle DAG)

热门文章

  1. springboot初始篇(一)
  2. Apache 工作模式配置优化
  3. C 实现一个跨平台的定时器 论述
  4. 原生js实现ajax
  5. C#中不同窗口之间传递值的两种方法
  6. 阿里淘宝天猫单点登录项目实战(附源码)
  7. 诗与远方:无题(六十三)- 杂诗,然,矣
  8. 诗和远方:无题(四十五)
  9. JavaScript脚本语言介绍并实现第一个Hello World程序
  10. 安卓学习之路之如何显示一个listview列表视图