所以我试图通过使用代码找出系统使用的字节序。我上网查了一下,发现有人有同样的问题,Stack Exchange上的一个答案有如下代码:
int num = 1;
if(*(char *)&num == 1)
{
printf("\nLittle-Endian\n");
}
else
{
printf("Big-Endian\n");
}
但是这个人没有解释为什么会这样,我也不能问。以下代码背后的原因是什么?
(*(char *)&num == 1)
我假设您使用的是 C/C++
&num
获取整数在内存中的地址num
。char
指针
(char *)
*(char *)&num
并与 1 进行比较。现在int
是 4 个字节。它将00 00 00 01
在大端系统和01 00 00 00
小端系统上。char 只有一个字节,因此强制转换为 char 的值将占用 . 占用的内存的第一个字节num
。所以在大端系统上是这样**00** 00 00 01
,在小端系统上是这样**01** 00 00 00
。因此,现在您使用 if 语句进行比较,以确定转换为 char 的 int 是否等同于在 little endian 系统上使用的字节顺序。
在 X86 32 位系统上,这可以编译为以下程序集
mov [esp+20h+var_4], 1 ; Moves the value of 1 to a memory address
lea eax, [esp+20h+var_4] ; Loads that memory address to eax register
mov al, [eax] ; Takes the first byte of the value pointed to by the eax register and move that to register al (al is 1 byte)
cmp al, 1 ; compares that one byte of register al to the value of 1
(*(char *)&num == 1)
大致翻译为取变量的地址num
。将其内容转换为字符并将该值与 1 进行比较。
如果整数第一个地址的字符是 1,那么它是低位字节,并且你的数字是 Little-Endian。
Big-Endian 数字将在最低地址具有高位字节(如果整数值为 1,则为 0),因此比较将失败。
我们都知道类型“int”占用4个字节,而“char”只有1个字节。该行只是将整数转换为char。它相当于:char c =(char)“num的最低字节”。
查看字节序的概念:http ://en.wikipedia.org/wiki/Endianness
那么如果主机是big-endian,c的值为0,否则为1。
一个例子是:假设 num 是 0x12345678,在 big-endian 机器上,c 将是 0x12 而在 little-endian 机器上 c 是 0x78
开始。您将值 1 分配给一个 4 字节的 int 所以
01 00 00 00 on little endian x86 00 00 00 01 on big endian
(*(char *)&num == 1)
&num 给出 int 的地址,但转换为 char* 将读取(取消引用)限制为 1 个字节(char 的大小)
如果第一个字节是 1,那么最低有效位首先出现,它是小端。