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

什么是计算机大小端?简单来说,大小端(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),而不要理会两边的通信是否需要这么做,在编写网络程序时最好用这两个函数。

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

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-05-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4435
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5288
来自专栏落花落雨不落叶

canvas画简单电路图

89211
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3035
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2882
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5548
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3017
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7436
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.5K7
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3882

扫码关注云+社区