测试系统Endianness的代码如何工作?

时间:2013-10-09 04:55:55

标签: memory system

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

  1. &num获取整数num的内存地址。
  2. 它将该地址解释为强制转换为char的指针 (char *)
  3. 接下来,这个指向char的指针的值被*(char *)&num中的第一个星号考虑并进行比较 到1。
  4. 现在int是4个字节。它在大端系统上是00 00 00 01,在小端系统上是01 00 00 00。 char只有一个字节,因此转换为char的值将占用num占用的内存的第一个字节。因此,在大端系统上,这将是**00** 00 00 01,在小端系统上,这将是**01** 00 00 00。 所以现在使用if语句进行比较,以确定int(转换为char)是否等效于小端系统上使用的字节数。

    在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
    

答案 1 :(得分:0)

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

粗略翻译为Take变量num的地址。将其内容转换为字符并将值与1进行比较。

如果整数的第一个地址处的字符是1,那么它是低位字节,而你的数字是Little-Endian。

在最低地址处,Big-Endian数字将具有高位字节(如果整数值为1,则为0),因此比较将失败。

答案 2 :(得分:0)

我们都知道类型“int”占用4个字节而“char”只占1个字节。 该行只是将整数转换为char.it等效于:char c =(char)“num的最低字节”。

查看endianess的概念:http://en.wikipedia.org/wiki/Endianness

然后如果主机是big-endian,则c的值将为0,否则为1。

一个例子是:  假设num为0x12345678,在big-endian机器上,c将为0x12,而在little-endian机器上c为0x78

答案 3 :(得分:0)

到此为止。您将值1分配给4字节int,所以

01 00 00 00 on little endian x86 00 00 00 01 on big endian

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

& num给出int的地址但是转换为char *将read(de-reference)限制为1个字节(char的大小)

如果第一个字节为1,那么最低有效位首先出现,它是小端。