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

简介:

情况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.   
  10. int main()  
  11. {  
  12.     printf("%c/n", ENDIAN);  
  13.     system("pause");  
  14.     return 0;  
  15. }  

 

补充: 
大小端模式对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,如需转载请自行联系原作者

相关文章
|
4月前
7-7 念数字 (15 分)(用数组简化判断过程)
7-7 念数字 (15 分)(用数组简化判断过程)
20 0
|
10月前
|
存储
学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2
(4). 取出内存中的 指数E(三种情况):E全为1 指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。 这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)
|
12月前
|
存储 资源调度 数据可视化
R问题|数值模拟流程记录和分享
R问题|数值模拟流程记录和分享
112 0
|
存储 编译器 C语言
计算机大端与小端的详细解析,含判断机器大小端代码
计算机大端与小端的详细解析,含判断机器大小端代码
213 0
|
存储 编译器 C语言
判断大小端问题
判断大小端问题
63 0
|
存储
【计算机系统结构】堆栈、累加、通用寄存器型机器对比
【计算机系统结构】堆栈、累加、通用寄存器型机器对比
402 0
输出十进制“08”等其他数值,报错无效的八进制数字,换个角度,三种方法解决问题
很显然,我们自己的语言与计算机有差别,我们想法是08,09,就是十进制数前加一个零,这是一个我们自定的格式,但计算机听不懂人类语言,就默认把0+某个数看成了八进制我们知道,八进制不可能出现8以上的数字,所以写程序时就有了下面这种报错:那我们赋值、输入时,无法表达出“我们认为”的这种所谓的十进制格式时,就应该换个角度去实现。.........
输出十进制“08”等其他数值,报错无效的八进制数字,换个角度,三种方法解决问题