小端或大端
#include union Endian { int i; char c[sizeof(int)]; }; int main(int argc, char *argv[]) { union Endian e; ei = 1; printf("%d \n",&e.i); printf("%d,%d,\n",ec[0],&(ec[0])); printf("%d,%d",ec[sizeof(int)-1],&(ec[sizeof(int)-1])); }
OUTPUT:
1567599464 1,1567599464, 0,1567599467
LSB存储在较低地址中,MSB存储在较高地址中。 这不应该是大端吗? 但我的系统配置显示它是一个小端架构。
你的系统绝对是little-endian
。它是big-endian
,代码如下:
printf("%d,%d,\n",ec[0],&(ec[0]));
将为第一个%d
而不是1
打印0
。 在little-endian
1中存储为
00000001 00000000 00000000 00000000 ^ LSB ^Lower Address
但在big-endian
它存储为
00000000 00000000 00000000 00000001 ^LSB ^Higher Address
并且不要使用%d
打印变量的地址,使用%p
。
对于小端,最低有效位存储在第一个字节中(具有最低地址)。
这就是你所看到的,所以似乎有理智;)
00000001 (Hexadecimal: 32 bits) ^^ ^^ MS LS Byte Byte
最低地址=> little-endian的最低有效字节。 整数从小端开始放入内存。 由此得名。
字节序
您将包含“1”(最低有效)的字节作为第一个元素(ec [0]),包含“0”的字节作为第二个元素(ec [1])。 这是litte endian,不是吗?
什么是Big endian以及什么是little endian你错了。 读这个
在我看来很好。 “little endian”(又名“正确的方式”:-)表示“先存储的低位字节”,这正是您的代码所显示的内容。 (顺便说一下,你应该使用“%p”来打印地址)。