所以我试图通过使用代码找出系统正在使用的字节序。我在网上查找,发现有人有同样的问题,Stack Exchange 上的一个答案是以下代码:
int num = 1;
if(*(char *)&num == 1)
{
printf("nLittle-Endiann");
}
else
{
printf("Big-Endiann");
}
但是这个人没有解释为什么这有效,我也不能问。以下代码背后的原因是什么?
(*(char *)&num == 1)
我假设你使用的是C/C++
-
&num
获取整数num
内存中的地址。 - 它将该地址解释为强制转换指向
char
的指针(char *)
- 接下来,这个指向字符的指针的值由
*(char *)&num
中的第一个星号考虑并进行比较到 1.
现在int
是 4 个字节。它将在大端系统上00 00 00 01
,在小端系统上01 00 00 00
。字符只有一个字节,因此转换为字符的值将占用num
占用内存的第一个字节。因此,在大端系统上,这将是**00** 00 00 01
,而在小端系统上,这将是**01** 00 00 00
。因此,现在您使用 if 语句进行比较,以确定转换为字符的 int 是否等同于小端系统上使用的字节顺序。
在 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,那么它是低位字节,你的数字是小端序。
大端数将在最低地址具有高位字节(如果整数值为 1,则为 0(,因此比较将失败。
我们都知道类型"int"占用4个字节,而"char"只有1个字节。该行只是将整数转换为 char.it 相当于:char c = (char("num 的最低字节"。
请参阅恩迪亚内斯的概念:http://en.wikipedia.org/wiki/Endianness
然后,如果主机是大端序,则 C 的值将为 0,否则为 1。
一个例子是: 假设 num 为 0x12345678,在大端机器上,c 将0x12,而在小端机器上,c 为0x78
来了。您将值 1 分配给 4 字节的整数,因此
01 0000 00 在小端序 x86 上00 00 00 01 在大端序
(*(字符 *(&数字 == 1(
&num 给出 int 的地址,但转换为 char* 会将读取(取消引用(限制为 1 个字节(字符大小(
如果第一个字节是 1,那么最低有效位先行,它是小端序。