判断系统大小端方法分析与总结

转自http://blog.csdn.net/delphiwcdj/article/details/6234383

问题 :如何用程序确认当前系统的存储模式(大端还是小端)?写一个C函数,若处理器是Big-endian的,则返回0;若是Little-endian的,则返回1。

情况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的首地址位置开始。因此,上面程序输出的结果就显而易见了。

判断系统大小端方法分析与总结

时间: 2024-09-27 21:11:28

判断系统大小端方法分析与总结的相关文章

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

bool IsLitterEndian() { union UTest { std::uint16_t t; std::uint8_t c; } endianTest{ 0x01 }; return (endianTest.c == 0x01); } 原文地址:https://www.cnblogs.com/fluteary/p/9178627.html

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

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系统驱动程序Logger源代码分析和Android应用程序框架层和系统运行库层日志系统源代码中,介绍了Android内核空间层.系统运行库层和应用程序框架层日志系统相关的源代码,其中,后一篇文章着重介绍了日志的写入操作.为了描述完整性,这篇文章着重介绍日志的读取操作,这就是我们在开发Android应用

系统监测和性能分析工具

作为一名linux运维工程师来说,对linux系统的日常管理,检测和系统性能的分析是必不可少的.也有一些针对系统监测和性能分析的工具.咱们现在就来了解一下. tcpdump命令: 网络抓包工具,过滤数据包或者定制输出格式: 常用选项: -n :  用IP地址表示主机,用数字表示端口号. -i  : 监听网卡接口, -i  any :   抓取所有网卡接口的数据包. -v  :  输出详细信息. -t :  不打印时间戳 -e :  显示以太网帧头部信息. -x  :  以十六进制数显示数据包的内

ECMall系统请求跳转分析

ecmall是一个基于mvc模式框架系统,跟thinkphp有点像.先从ecmall的入口开始,ecmall入口文件upload/index.php.admin.php: index.php启动ecmall前台,启动后则进入ecmall框架核心文件ecmall.php. ecmall.php相当于一个调度中心,接收不同的控制命令(app)以及命令的相关操作(funciton),接着对其进行分配处理.然后调度中心把这些命令(app)和方法(function) 传到前台控制中心对应的具体控制器上."

Android底层开发之Linux输入子系统要不要判断系统休眠状态上报键值

Android底层开发之Linux输入子系统要不要判断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是无用的,甚至是错误的.重点在最后,前边仅仅是一些假想推测. http://blog.csdn.net/kangear/article/details/40072707 在调试一下红外遥控器input驱动时,直接采用的是一个半成品的驱动在上边实现的自己的设备的匹配,但同时遇到了一些关于input输入子系统的疑惑. 按键一般有「按下和抬起」两个状态一般使用0和1来分

B2C电子商务系统研发——商品SKU分析和设计

一.SKU及相关概念定义 在设计商品SKU之前,首先让我们熟悉一下SKU和相关的一些概念. # 什么是SKU: SKU=Stock Keeping Unit(库存量单位) 同一型号的商品,或者说是同一个产品项目(商品条形码是针对企业的产品 项目来进行定义的),因为产品与产品之间有某些属性不同,用以区别开这些 不同商品的属性即商品变异属性,又称作SKU属性,因为它决定了SKU 的绝对数量. # 参考说明 百度上有一篇文章也有阐述,可以做关联阅读,我就不重复贴上了. 百度SKU参考 # 什么是SKU

实时计算,流数据处理系统简介与简单分析

转自:http://www.csdn.net/article/2014-06-12/2820196-Storm 摘要:实时计算一般都是针对海量数据进行的,一般要求为秒级.实时计算主要分为两块:数据的实时入库.数据的实时计算.今天这篇文章详细介绍了实时计算,流数据处理系统简介与简单分析. 编者按:互联网领域的实时计算一般都是针对海量数据进行的,除了像非实时计算的需求(如计算结果准确)以外,实时计算最重要的一个需求是能够实时响应计算结果,一般要求为秒级.实时计算的今天,业界都没有一个准确的定义,什么

写程序判断系统是大端序还是小端序

大端是高位字节先存储(低地址) 小端是低位字节先存储(低地址) 网络字节序是大端的,也就是高位字节先传输 而int--char的强制转换,是将低地址的数值截断赋给char,利用这个准则可以判断系统是大端序还是小端序 #include <iostream> using namespace std; int main() { int a = 0x1234; char c = static_cast<char>(a); if (c == 0x12) cout << "

B2C电子商务系统研发——商品SKU分析和设计(二)

转:http://www.cnblogs.com/winstonyan/archive/2012/01/07/2315886.html 上文谈到5种商品SKU设计模式,本文将做些细化说明. 笔者研究过不少电子商务平台软件,关于SKU的设计各有不同,之所以有这样的区别,是因为面向不同规模的电子商务网站, 存在产品分类复杂度,产品数量级的差异.一种设计方式对于百货式的网站,如京东.淘宝等,也许比较方便,但也许对于一个 专卖服装的小型时尚类网站就不够方便了. 我们先看一下麦包包的 女包:http://