所以我试图通过使用代码找出系统正在使用的endianess。我在网上查看,发现有人有同样的问题,Stack Exchange上的一个答案有以下代码:
int num = 1;
if(*(char *)&num == 1)
{
printf("\nLittle-Endian\n");
}
else
{
printf("Big-Endian\n");
}
但是这个人没有解释为什么会这样,我不能问。以下代码背后的原因是什么?
(*(char *)&num == 1)
答案 0 :(得分:3)
我假设您使用的是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语句进行比较,以确定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,那么最低有效位首先出现,它是小端。