博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大端小端
阅读量:5891 次
发布时间:2019-06-19

本文共 1714 字,大约阅读时间需要 5 分钟。

 

big-endian和little-endian这两个术语来自Jonathan Swift在十八世纪的嘲讽作品Gulliver’s Travels。 Blefuscu帝国的国民被根据吃鸡蛋的方式划分为两个部分:一部分在吃鸡蛋的时候从鸡蛋的大端(big end)开始,而另一部分则从鸡蛋的小端(little end)开始。

x86的CPU使用的是LE(Windows中称为“主机字节序”),而SocksAddr中使用的则是BE(就是“网络字节序”),所以在使用网络编程时需要使用htns,htnl,nths,nthl来倒字节序。

其实对汇编熟了就清楚了,惨,我的汇编很惨的

LE little-endian 
最符合人的思维的字节序 
地址低位存储值的低位 
地址高位存储值的高位 
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说 
低位值小,就应该放在内存地址小的地方,也即内存地址低位 
反之,高位值就应该放在内存地址大的地方,也即内存地址高位 
BE big-endian 
最直观的字节序 
地址低位存储值的高位 
地址高位存储值的低位
 
为什么说直观,不要考虑对应关系 
只需要把内存地址从左到右按照由低到高的顺序写出 
把值按照通常的高位到低位的顺序写出 
两者对照,一个字节一个字节的填充进去 
例子:在内存中双字0x01020304(DWORD)的存储方式 
内存地址 
4000 4001 4002 4003 
LE 04 03 02 01 
BE 01 02 03 04 
MSDN中关于LE和BE的解释
Byte Ordering Byte ordering Meaning 
big-endian The most significant byte is on the left end of a word. 
little-endian The most significant byte is on the right end of a word. 
这里这个最重要的字节可以解释成值的最高位,如果换成是钱的话就是最值钱的那一位 
比如我有1234元人民币,最值钱的是1000元,最不值钱的是4元,那么这个1就是最重要的字节

Big endian machine: It thinks the first byte it reads is the biggest.

Little endian machine: It thinks the first byte it reads is the littlest.
举个例子,从内存地址0x0000开始有以下数据
0x0000    0x12
0x0001    0x34
0x0002    0xab
0x0003    0xcd
如果我们去读取一个地址为0x0000的四个字节变量,若字节序为big-endian,则读出
结果为0x1234abcd;若字节序位little-endian,则读出结果为0xcdab3412.
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                big-endian    little-endian
0x0000    0x12              0xcd
0x0001    0x23              0xab
0x0002    0xab              0x34
0x0003    0xcd              0x12
x86系列CPU都是little-endian的字节序.

 
解一个大小端的面试题:
//在一个 big endian 的 32 位的计算机上,b 的结果是______int a = 0x1234;int *p = &a;char b = *((char*)&a);a=0;

int型的a在内存中占4个字节。实际上表示是:0x00 00 12 34;因为是大端,所以在内存中的排序是高位数据放在低位内存区,从低内存地址(假如0x0012ff50)开始 00001234排列

&是取地址,从低内存地址开始,char占1个字节,即为0

如果是小端:数据在内存中的排列顺序是0x0012FF50  34 12 00 00 ,b的值就是4了

 

转载于:https://www.cnblogs.com/yep3575/p/3148162.html

你可能感兴趣的文章
云服务器都是有哪些特点? 云服务器有更高的性价比
查看>>
Effective Objective-C 2.0 第一章学习
查看>>
微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa
查看>>
技术专栏丨从原理到应用,Elasticsearch详解(下)
查看>>
Python数据分析入门(三)
查看>>
JavaScript面向对象详解(原理)
查看>>
一个用Git交互可视化教学的项目
查看>>
LSM存储引擎基本原理
查看>>
webstrom编辑器scss环境以及ES6环境配置
查看>>
使用 Hbuild 快速构建生成现代化前端项目
查看>>
Windows虚拟环境在PyCharm中的使用
查看>>
CentOS安装JDK
查看>>
i++引发的惨案
查看>>
添加16行代码,删除了6行代码就能支持一键1秒买卖Zcash了?
查看>>
iOS 动画之弹性 Spring
查看>>
[写作中...]Js面向对象(2): 创建对象
查看>>
我是如何在硅谷获得年薪30万美金Offer的?
查看>>
Java 锁机制(synchronized 与 Lock)
查看>>
webpack 3 零基础入门教程 #1 - 介绍
查看>>
Kotlin 写一个通用Adapter (二)
查看>>