1

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

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

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

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

4 回答 4

4

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

  1. &num获取整数在内存中的地址num
  2. 它将该地址解释为一个指向 a 的char指针 (char *)
  3. 接下来,这个指向 char 的指针的值由 in 的第一个星号考虑*(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
于 2013-10-09T05:07:25.027 回答
0
(*(char *)&num == 1)

大致翻译为取变量的地址num。将其内容转换为字符并将该值与 1 进行比较。

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

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

于 2013-10-09T05:03:00.760 回答
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

于 2013-10-09T05:04:48.633 回答
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* 将读取(取消引用)限制为 1 个字节(char 的大小)

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

于 2013-10-09T05:13:58.463 回答