这段测试系统Endianess的代码是如何工作的?



所以我试图通过使用代码找出系统正在使用的字节序。我在网上查找,发现有人有同样的问题,Stack Exchange 上的一个答案是以下代码:

int num = 1;
if(*(char *)&num == 1)
{
    printf("nLittle-Endiann");
}
else
{
    printf("Big-Endiann");
}

但是这个人没有解释为什么这有效,我也不能问。以下代码背后的原因是什么?

(*(char *)&num == 1)

我假设你使用的是C/C++

  1. &num 获取整数num内存中的地址。
  2. 它将该地址解释为强制转换指向char的指针 (char *)
  3. 接下来,这个指向字符的指针的值由*(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 00

00 00 在小端序 x86 上00 00 00 01 在大端序

(*

(字符 *(&数字 == 1(

&num 给出 int 的地址,但转换为 char* 会将读取(取消引用(限制为 1 个字节(字符大小(

如果第一个字节是 1,那么最低有效位先行,它是小端序。

最新更新