C++面试题之字节序—大端和小端

1.字节序
        简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。注意字节序是硬件层面的东西,对于软件来说通常是透明的。也就是说,字节序通常只和你使用的处理器架构有关,而和编程语言无关,比如常见的Intel x86系列就是小端序。
2.大端(Big-Endian)
        数据高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
3.小端(Little-Endian)
        数据低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
4.举例
        假设一个32位 unsigned int型数据0x12 34 56 78,大小端8位存储方式如下:
        低地址 —————–> 高地址
        大端存储方式为0x12 34 56 78
        低地址 —————–> 高地址
        小端存储方式为0x78 56 34 12

        假设从内存地址0x4000开始存放,结果如下图所示。

        一个很好的记忆方法是,大端字节序是按照数据的书写顺序进行存储,而小端字节序是颠倒书写顺序进行存储。

5.常见CPU的字节序
        大端: PowerPC、IBM、Sun
        小端: x86、DEC

        ARM既可以工作在大端,也可以工作在小端。

        判断方法:

bool IsBigEndian()  
{  
    int a = 0x1234; 
    //通过将int强制类型转换成char单字节,相当于取b等于a的低地址部分   
    char b =  *(char *)&a;  
    if( b == 0x12)  
    {  
        return true;  
    }  
    return false;  
}

6.网络字节序
        所有的网络通讯协议都是使用大端字节序的编码。
        C/C++中有如下四个常用的转换函数,这四个函数在小端系统中生效,大端系统由于和网络字节序相同,所以无需转换。
        htons—把unsigned short类型从主机序转成网络字节序
        ntohs—把unsigned short类型从网络字节序转成主机序
        htonl—把unsigned long类型从主机序转成网络字节序
        ntohl—把unsigned long类型从网络字节序转成主机序

       使用以上函数需包含头文件:

#if defined(_LINUX) || defined(_DARWIN)
#include <netinet/in.h>
#endif

#ifdef WIN32
#include <WINSOCK2.H>
#endif

参考链接:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html

参考链接:http://blog.csdn.net/ce123_zhouwei/article/details/6971544

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草上爬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值