<h1 style="text-align:center"><span style="font-size:32px">大端格式、小</span><span style="font-size:32px">端</span><span style="font-size:32px">格式、数据在内存中的存储方式</span></h1>
<div>
<span style="font-size:32px"><br> </span>
</div>
<div>
<span style="font-size:32px"><br> </span>
</div>
<div style="text-align:left">
<span style="font-size:18px">内存中的地址.左→右,地址降低,下→上,地址升高。一个格子是一个字节,一个字节是8位。</span>
</div>
<div style="text-align:left">
<span style="font-size:18px">int a = 0x01020304</span>
</div>
<div style="text-align:left">
<span style="font-size:18px"><br> </span>
</div>
<div style="text-align:left">
<span style="font-size:18px">若为大端格式(arm默认是小段格式):地地址存放高位</span>
<table border="1" cellpadding="1" cellspacing="1" width="200"><caption>
内存格式
</caption><tbody><tr><th>0x4001</th><th>0x4002</th><th>0x4003</th><th>0x4004</th></tr></tbody><tbody><tr><th>01</th><td>02</td><td>03</td><td>04</td></tr><tr><th> </th><td> </td><td> </td><td> </td></tr></tbody></table>
<h1 style="text-align:center"><br> </h1>
</div>
<div style="text-align:left">
<span style="font-size:18px"><span style="font-size:18px">小端格式</span><span style="font-size:18px; white-space:pre"></span><span style="font-size:18px">:x86、windows:低地址存放底位</span><br> <br> </span>
<table border="1" cellpadding="1" cellspacing="1" width="200"><caption>
内存格式
</caption><tbody><tr><th>0x4001</th><th>0x4002</th><th>0x4003</th><th>0x4004</th></tr></tbody><tbody><tr><th>04</th><td>03</td><td>02</td><td>01</td></tr><tr><th> </th><td> </td><td> </td><td> </td></tr></tbody></table>
<br>
</div>
<div style="text-align:left">
<span style="font-size:18px"><br> </span>
</div>
<div style="text-align:left">
<span style="font-size:18px">测试函数,我的linux是小端格式,下面请看程序</span>
</div>
<div style="text-align:left">
<span style="font-size:18px"><br> </span>
</div>
<div style="top:0px">
#include <stdio.h>
<br> #include <stdlib.h>
<br> #include <inttypes.h>
<br> #include <string.h>
<br>
<br> typedef struct led_reports_st {
<br> char ch;
<br> int it;
<br> char string[3];
<br> uint32_t serial_no;
<br> }node;
<br>
<br> node Node = {0x01, 0x01020304, "a", 32};
<br> int main ()
<br> {
<br>
<span style="white-space:pre"></span>int i;
<br>
<span style="white-space:pre"></span>char *p_char;
<br>
<span style="white-space:pre"></span>p_char = (char *)&Node;
<br>
<span style="white-space:pre"></span>for(i=0; i < sizeof(Node); i++)
<br>
<span style="white-space:pre"></span>{
<br>
<span style="white-space:pre"></span>printf("a[%d]:%d\n", i, p_char[i]);
<br>
<span style="white-space:pre"></span>}
<br>
<span style="white-space:pre"></span>printf("sizeof(Node):%d\n", sizeof(Node));
<br>
<span style="white-space:pre"></span>printf("sizeof(uint32_t):%d\n", sizeof(uint32_t));
<br>
<span style="white-space:pre"></span>return 1;
<br> }
<br>
</div>
<div style="top:0px">
<br>
</div>
<div style="top:0px">
输出结果是:
</div>
<div style="top:0px">
a[0]:1
<br> a[1]:0
<br> a[2]:0
<br> a[3]:0
<br> a[4]:4
<br> a[5]:3
<br> a[6]:2
<br> a[7]:1
<br> a[8]:97
<br> a[9]:0
<br> a[10]:0
<br> a[11]:0
<br> a[12]:32
<br> a[13]:0
<br> a[14]:0
<br> a[15]:0
<br> sizeof(Node):16
<br> sizeof(uint32_t):4
<br>
</div>
<div style="top:0px">
<br>
</div>
<div style="top:0px">
可以看到a[4]-a[7]中的数据是04、03、02、01。所以是小端格式。
</div>
<div style="top:0px">
<br>
</div>
<div style="top:0px">
<br>
</div>
<div style="top:0px">
另外,该实例程序还展示了char指针的一种用途,将结构体转换成char指针,这样如果清楚struct的结构体和内存对齐格式,就可以直接使用数组读取结构体中的指定内容了。
</div>
<div style="top:0px">
指针是一种非常灵活的东西,需要多理解。
</div>
<div style="top:0px">
<br>
</div>
<div style="top:0px">
<br>
</div>
<div style="top:0px">
<br>
</div>
<div style="top:0px">
<h1 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px; text-align:center"> 详解大端模式和小端模式</h1>
<h1 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"> <a name="t1" style="color:rgb(51,102,153)" target="_blank"></a><a name="t1" style="color:rgb(255,153,0)" target="_blank"></a><span style="font-size:18px">一、大端模式和小端模式的起源</span></h1>
<span style="color:rgb(51,51,51); font-family:Arial; line-height:26px; font-size:18px"> 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了, |
|