首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【编程基础】简单理解大小端那些事儿

【编程基础】简单理解大小端那些事儿

作者头像
程序员互动联盟
发布2018-03-13 11:55:11
发布2018-03-13 11:55:11
2.4K0
举报

什么是计算机大小端?简单来说,大小端(Endian)是指数据存储或者传输时的字节序,大小端分大端和小端。

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

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

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

例如一个16bit的short型数值6699,十六进制是0x1A2B,一共占用两个字节。如果把这个数放到内存地址为0x00400000开始的地方,显然它要占用的内存为0x00400000和0x00400001两个单元,对于0x1A2B,那么0x1A为高字节(权值较高),0x2B为低字节。对于大端模式,就将0x1A放在低地址中,即0x00400000中,0x2B放在高地址中,即0x00400001中。小端模式刚好相反,0x1A放在0x00400001,而0x2B放在0x00400000中。如下图:

对于32位的数据也是一样,比如0x1A2B3C4D,在大端模式下存储就是1A 2B 3C 4D,而小端模式则为4D 3C 2B 1A。

我们常用的x86结构就是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。常见的windows、Linux系统都是小端模式,网络传输则是大端模式,因此用网络传输数据时,如果完全是字节数据还无所谓,但是如果传输short,int这种多字节单位,就需要注意顺序。系统为了应用不考虑这个问题,提供了相应的函数:1、发送的时候使用:htons(n) 2、接受的时候使用:ntohs(n),而不要理会两边的通信是否需要这么做,在编写网络程序时最好用这两个函数。

那么如何来判断自己的系统是大端还是小端呢?下面就是最简单的判断方法:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档