味增 發表於 2022-5-24 07:55:00

linux大小端

<h2><strong><span style="background-color: rgba(0, 255, 255, 1)">1、大小端的原理</span></strong></h2>
<p>字节序:又称尾序、端序</p>
<p><strong>大端(big endian)</strong>:将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。<span style="background-color: rgba(0, 255, 255, 1)">简称高低</span></p>
<p><strong>小端(little endian)</strong>:将数据的低位放在较小的地址处,高位放在较大的地址处。<span style="background-color: rgba(0, 255, 255, 1)">简称高高</span></p>
<p>笔者假设存储数据为0x89ABCDEF&nbsp; 32位数据</p>
<p><span style="background-color: rgba(0, 255, 255, 1)">大端存储:</span></p>
<table border="0">
<tbody>
<tr>
<td>低地址</td>
<td colspan="4">&nbsp;</td>
<td>高地址</td>
</tr>
<tr>
<td>.......</td>
<td>0x89</td>
<td>0xAB</td>
<td>
<p>0xCD</p>
</td>
<td>0xEF</td>
<td>......</td>
</tr>
</tbody>
</table>
<p><span style="background-color: rgba(0, 255, 255, 1)">小端存储:</span></p>
<table border="0">
<tbody>
<tr>
<td>低地址</td>
<td colspan="4">&nbsp;</td>
<td>高地址</td>
</tr>
<tr>
<td>.......</td>
<td>0xEF</td>
<td>0xCD</td>
<td>
<p>0xAB</p>
</td>
<td>0x89</td>
<td>......</td>
</tr>
</tbody>
</table>
<h2><span style="background-color: rgba(0, 255, 255, 1)">2、大小端存储优劣以及原因</span></h2>
<table border="0">
<tbody>
<tr>
<td>&nbsp;</td>
<td>优点</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>大端</td>
<td>适合人类书写、阅读</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>小端</td>
<td>适合计算机阅读,CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。即地址访问时由低到高</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
小端存储 第一个字节是它的低位,符号位在最后一个字节,这样在做数值四则运算时从低位每次取出相应字节运算,最后直到高位,并且最终把符号位刷新,这样的运算方式会更高效。且大部分架构计算机采用小端存储。部分架构采用可改变的端存储。
<h2><span style="background-color: rgba(0, 255, 255, 1)">3、大小端历史来源</span>&nbsp; &nbsp;</h2>
<div>
<div>关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。</div>
</div>
<p>&nbsp;</p>
<h2><span style="background-color: rgba(0, 255, 255, 1)">4、如何测试设备大小端</span></h2>
<div class="cnblogs_code">
<pre> lscpu | grep -i <span style="color: rgba(0, 0, 255, 1)">byte<br> Little Endian 则为小端,Big Endian为大端<br></span></pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>echo -n I | od -o | head -n1 | cut -f2 -d<span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 0, 1)">"</span> | cut -<span style="color: rgba(0, 0, 0, 1)">c6
输出:1为小端模式,0为大端模式;</span></pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>echo -n I | od -o | head -n1 | awk <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{print $2}</span><span style="color: rgba(128, 0, 0, 1)">'</span>| cut -<span style="color: rgba(0, 0, 0, 1)">c6
输出:1为小端模式,0为大端模式;</span></pre>
</div>
<h2><span style="background-color: rgba(0, 255, 255, 1)">5、参考:</span></h2>
<p>https://zhuanlan.zhihu.com/p/352145413</p>
<p>https://blog.csdn.net/loveprogram_1/article/details/30464761</p>
<p>https://www.zhihu.com/question/25311159</p>
<p>https://blog.csdn.net/nicai_xiaoqinxi/article/details/85311458</p><br><br>
来源:https://www.cnblogs.com/tzj-kernel/p/16304138.html
頁: [1]
查看完整版本: linux大小端