大端模式&小端模式 怼烎@ 2022-08-06 12:25 135阅读 0赞 在C语言中除了8位的char型之外,还有16 位 的short型,32 位 的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。 大端模式: 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。 小端模式: 与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。 例如,16位宽的数0x1234在 小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为: <table style="table-layout:auto"> <tbody> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 内存地址</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x4000</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x4001</p> </td> </tr> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 存放内容</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x34</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x12</p> </td> </tr> </tbody> </table> 而在大端模式CPU内存中的存放方式则为: <table style="table-layout:auto"> <tbody> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 内存地址</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x4000</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x4001</p> </td> </tr> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 存放内容</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x12</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; visibility:visible!important; zoom:1!important"> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"> 0x34</p> </td> </tr> </tbody> </table> 32位宽的数0x12345678在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为: <table style="table-layout:auto; margin:auto auto auto 5.4pt; border-collapse:collapse"> <tbody> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border:1pt solid windowtext; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">内存地址</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x4000</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x4001</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x4002</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x4003</p> </td> </tr> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid; border-color:rgb(236,233,216) windowtext windowtext; border-width:medium 1pt 1pt; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">存放内容</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x78</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x56</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x34</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px">0x12</p> </td> </tr> </tbody> </table> 而在大端模式CPU内存中的存放方式则为: <table style="table-layout:auto; margin:auto auto auto 5.4pt; border-collapse:collapse"> <tbody> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border:1pt solid windowtext; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 内存地址</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x4000</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x4001</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x4002</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:solid solid solid none; border-color:windowtext windowtext windowtext rgb(236,233,216); border-width:1pt 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x4003</p> </td> </tr> <tr> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid; border-color:rgb(236,233,216) windowtext windowtext; border-width:medium 1pt 1pt; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 存放内容</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x12</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x34</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x56</p> </td> <td style="font-family:Arial; word-wrap:break-word; word-break:break-all; border-style:none solid solid none; border-color:rgb(236,233,216) windowtext windowtext rgb(236,233,216); border-width:medium 1pt 1pt medium; padding:0cm 5.4pt; width:53.85pt; visibility:visible!important; zoom:1!important; background-color:transparent"> <p style="margin:0cm 0cm 0pt; padding-top:0px; padding-bottom:0px; text-align:center"> 0x78</p> </td> </tr> </tbody> </table> 我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。 Note:采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。 (我的理解:小端模式在低字节就放一个低位) 下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式: int main() { short int x; char x0, x1; x = 0x1122; x0 = *((char*) &x); //低地址单元 ,或者((char*)&x)[0]; x1 = *((char*) &x + 1); //高地址单元,或者((char*)&x)[1]; printf("x0=%x\nx1=%x\n", x0, x1); } 若x0=0x11,则是大端; 若x0=0x22,则是小端......
还没有评论,来说两句吧...