一、大端模式&小端模式

所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

所谓的“小端模式”,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

如果将一个32位的整数0x12345678 存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本文使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。

地址偏移        大端模式       小端模式 
0x00           12(OP0)      78(OP3) 
0x01           34(OP1)      56(OP2) 
0x02           56(OP2)      34(OP1) 
0x03           78(OP3)      12(OP0)

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

采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。

下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:

short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......
上面的程序还可以看出,数据寻址时,用的是低位字节的地址

二、主机序&网络序

不同的 CPU 有不同的字节序类型这些字节序是指整数在内存中保存的顺序这个叫做主机序,最常见的有两种: 
1、Little endian :将低序字节存储在起始地址 
2、Big endian :将高序字节存储在起始地址

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换 bsd socket提供了转换的函数 有下面四个:
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

在使用little endian的系统中,这些函数会把字节序进行转换 
在使用big endian类型的系统中,这些函数会定义成空宏

同样,在网络程序开发时,或是跨平台开发时,也应该注意保证只用一种字节序,不然两方的解释不一样就会产生BUG。

注:
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表:

处理器             操作系统     字节排序
Alpha                   全部      Little endian
HP-PA                    NT       Little endian
HP-PA                   UNIX     Big endian
Intelx86                全部     Little endian <-----x86系统是小端字节序系统
Motorola680x()          全部    Big endian
MIPS                     NT       Little endian
MIPS                    UNIX    Big endian
PowerPC                  NT     Little endian
PowerPC                 非NT    Big endian   <-----PPC系统是大端字节序系统
RS/6000                 UNIX    Big endian
SPARC                   UNIX    Big endian
IXP1200 ARM核心         全部      Little endian

下面是一个检验本机字节序的简便方法:

//判断本机的字节序
//返回true表为小段序。返回false表示为大段序
bool am_little_endian ()
{
unsigned short i=1;
return (int)*((char *)(&i)) ? true : false;
}
int main()
{
   if(am_little_endian())
{
            printf("本机字节序为小段序!\n");
}
else
{
          printf("本机字节序为大段序!\n");
}
        return 0;
}

三、入栈地址高低问题

堆栈是在内存中指定的一段特殊存储区,存起始单元的地址叫栈底,当前存储单元地址叫栈顶,堆栈存储区一旦指定,栈底就固定不变了,而栈顶是随入栈、出栈操作呈动态。而不同机型的堆栈设计,有两种情况:一是每入栈一个数,栈顶地址加1,每出栈一个数,栈顶地址减1,即堆栈区是由内存的低地址向高地址。另一种是每入栈一个数,栈顶地址减1,每出栈一个数,栈顶地址加1,即堆栈区是由内存的高地址向低地址。高地址、低地址是相对而言,即相对地址编码的大小而言。

转载于:https://www.cnblogs.com/ablogia/p/3266321.html

大端模式小端模式、主机序网络序、入栈地址高低问题相关推荐

  1. 大端模式小端模式 主机序网络序

    1. 主机序 不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序,这个叫做主机序.最常见的有两种: 1.         Little endian:将低序字节存储在起始地址. 即小端 ...

  2. 大端模式-小端模式详解

    大端模式(big endian),小端模式(little endian)指的是什么? 端(endian)模式是指计算机中字节的存储顺序.地址的高低与字节的高位和低位的对应关系就有了大端和小端的区别. ...

  3. 大端模式小端模式详解(不懂你打我,略略~~)

    大端模式小端模式详解(不懂你打我,略略~~) 先看概念 大端模式(Big-Endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作 ...

  4. 网络通信时字节序转换原理与网络字节序、大端和小端模式 .

    引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换.原因如下:网络协议规定接收到得第一个字节是高字节, ...

  5. 网络通信之 字节序转换原理与网络字节序、大端和小端模式

    一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节, ...

  6. 套接字中的数据转换(大端模式/小端模式)

    通常使用的有两种数据类型:短型(两个字节)和长型(四个字节). 下面介绍的这些转换函数对于这两类的无符号整型变量都可以正确的转换. 如果你想将一个短型数据从主机字节顺序转换到网络字节顺序的话,有这样一 ...

  7. 判断单片机MCU是大端还是小端模式

    最近用杰理AC6966B调试博通的BK9527 U段发射芯片,一直没调通,经过测试IIC通讯是通,硬件还是好的,但是怎么都调不到与接收端成功连接. 最后咨询原厂得知提供的demo代码是大端编码模式的M ...

  8. 嵌入式大端、小端模式存储

    中文名(大小端模式)                                               外文名(Big-endian/Little-endian) 大端模式,是指数据的高字节 ...

  9. 大端模式 小端模式学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> Big-Endian和Little-Endian的定义如下: 1) Little-Endian就是低位字节排放在内存的低地址端 ...

最新文章

  1. RabbitMQ 入门系列(10)— RabbitMQ 消息持久化、不丢失消息
  2. Linux开发板怎么用madplay,Linux中madplay 音乐播放器移植步骤
  3. PPT 2016的加解密功能
  4. 为什么要学习C++,它到底能做什么?
  5. ·MySQL数据库管理(SQL操作命令,解决忘记密码,设置用户权限)
  6. 查看虚拟机cpu型号_虚拟机管理器(Virtual Machine Manager)简介 | Linux 中国
  7. mysql 5.6 5.7不兼容_同一条sql在mysql5.6和5.7版本遇到的问题。
  8. 住170平以上的大平层大户型什么感觉?
  9. 微信自定义菜单java_使用Java语言开发微信公众平台(八)——自定义菜单功能
  10. python string转int_Python编程入门:time模块常用技巧
  11. dbeaver导出建表语句_「mysql基础」MySQL常用语句命令总结(文字版)
  12. 吴恩达深度学习课程第四章第二周编程作业(pytorch实现)
  13. 易优插件采集伪原创发布插件免费
  14. Windows 常用快捷键 打开cmd DOS命令
  15. 硬改路由器-MW310R-AR9341篇
  16. 图片文字怎么合并转发_怎么把图片和文字组合发微信
  17. linux x200 黑屏,Thinkpad x200黑屏(一长两短) 复原
  18. 回溯法实现求解子集合和问题
  19. 微电子新手入门之 Origin画图
  20. Nodelist转化问题。

热门文章

  1. 看下completablefuture(暂时没看完)
  2. kafka中的groupid
  3. sc.textFile的相对路径与绝对路径
  4. intellij设置java中的代码中的import不折叠
  5. groupby的用法
  6. mysql-workbench连接数据库
  7. 【机器学习】支持向量机面试知识点小结
  8. 解决Eclipse中SVN版本比较中文乱码问题
  9. oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案
  10. 在WordPress中添加简书风格的连载目录和文章导航