[笔试题] 如何判断主机是大端还是小端(字节序)

所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址。比如0x12345678在大端机上是12345678,在小端机上是78564312,而一个主机是大端还是小端要看cpu类型以及运行在上面的操作系统。同一款cpu在不同的操作系统使用的大小端情况是不同的。当然我们通常使用的x86+windows是小端。

首先我们给出大小端的定义:

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。

大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

将0x12345678写入到以1000h开始的内存中,这里0x12346578中0x12~0x78的地址是从高到低

如果,我们的机器是小端存储的话,结果为:

数据      地址
0x78        1000H
0x56        1001H
0x34        1002H
0x12        1003H
如果我们的机器是大端存储的话,结果为:

数据      地址
0x12        1000H
0x34        1001H
0x56        1002H
0x78        1003H

写到这里,读者大概明白,大小端是怎么存储在内存中,然后我们给出判断大小端的方法.

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<cstdlib>  
  4. #include<cstring>  
  5. #include<string>  
  6. #include<queue>  
  7. #include<algorithm>  
  8. #include<map>  
  9. #include<iomanip>  
  10. #define INF 99999999  
  11. using namespace std;  
  12.   
  13. int panduan_1(){  
  14.     int a = 0x12345678;  
  15.     int *c = &a;  
  16.     for(int i = 0;i<4;i++){  
  17.         cout<< &c[i] <<endl;  
  18.     }  
  19.     return ((c[0]==0x78)&&(c[1]==0x56)&&(c[2]==0x34)&&(c[3]==0x12));  
  20. }  
  21. union p{  
  22.     int a;  
  23.     char b;  
  24. };  
  25. int panduan_2(){  
  26.     p p1;  
  27.     p1.a = 1;  
  28.     return p1.a==p1.b;  
  29. }  
  30. int main(){  
  31.   
  32.     if(panduan_1()){  
  33.         cout<<"big duan"<<endl;  
  34.     }else{  
  35.         cout<<"little duan"<<endl;  
  36.     }  
  37.     if(panduan_2()){  
  38.         cout<<"little duan"<<endl;  
  39.     }else{  
  40.         cout<<"big duan"<<endl;  
  41.     }  
  42.     return 0;  
  43. }  

结果:



方法1:是利用定义,在地址上判断存的是否是高低位的数据,来解决问题.

方法2:在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同

的起始地址。即上述的union虽然定义了两个成员,但其实这个union只占用了4个字节(32位机器中),往a成员

赋值,然后读取b就相读取a成员的低位第一个字节的值。如果机器使用大端模式,则u.a=1那a的最高字节值为1;

如果机器使用小段模式,则u.a=1则a的最低位字节为1。上述可知b和a有相同的起始位,所以读取b如果等于1,

则为小端模式,b为0则为大端模式

[java]  view plain  copy
  1. import java.io.ByteArrayOutputStream;  
  2. import java.io.DataOutputStream;  
  3.   
  4.   
  5. public class demo {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) throws Exception {  
  11.         // TODO Auto-generated method stub  
  12.         int a = 0x12345678;  
  13.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  14.         DataOutputStream dos = new DataOutputStream(baos);  
  15.         dos.writeInt(a);  
  16.         byte[] b = baos.toByteArray();  
  17.         for(int i = 0;i<4;i++){  
  18.             System.out.println(Integer.toHexString(b[i]));  
  19.         }     
  20.     }  
  21.   
  22. }  
结果:



JVM中,实际是以大端存储的.

这样,我们通过两种语言来解决大小端问题.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值