Memory 测试系统持久性的代码是如何工作的?

Memory 测试系统持久性的代码是如何工作的?,memory,system,Memory,System,所以我试图通过使用代码来找出系统正在使用的持久性。我在网上查看,发现有人提出了相同的问题,Stack Exchange上的一个答案有以下代码: int num = 1; if(*(char *)&num == 1) { printf("\nLittle-Endian\n"); } else { printf("Big-Endian\n"); } 但这位人士没有解释为什么会这样,我也不能问。以下代码背后的原因是什么 (*(char *)&num == 1) 大致

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

int num = 1;
if(*(char *)&num == 1)
{
    printf("\nLittle-Endian\n");
}
else
{
    printf("Big-Endian\n");
}
但这位人士没有解释为什么会这样,我也不能问。以下代码背后的原因是什么

(*(char *)&num == 1)
大致翻译为获取变量num的地址。将其内容转换为一个字符,并将该值与1进行比较

如果整数的第一个地址处的字符是1,那么它是低阶字节,并且您的数字是Little Endian

如果最低地址的整数值为1,则大端数字的高位字节为0,因此比较将失败

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

如果整数的第一个地址处的字符是1,那么它是低阶字节,并且您的数字是Little Endian


如果最低地址的整数值为1,则大端数字的高阶字节为0,因此比较将失败。

我们都知道int类型占用4个字节,而char仅占1个字节。 该行只是将整数转换为字符。它相当于:char c=chart num的最低字节

参见endianess的概念:

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

例如:
假设num是0x12345678,在大端机器上,c是0x12,而在小端机器上,c是0x78,我们都知道int类型占用4个字节,而char只占用1个字节。 该行只是将整数转换为字符。它相当于:char c=chart num的最低字节

参见endianess的概念:

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

例如:
假设num是0x12345678,在大端机器上,c是0x12,而在小端机器上,c是0x78++

&num取整数num在内存中的地址。 它将该地址解释为通过强制转换指向字符的指针 煤焦* 接下来,*char*&num中的第一个asterix考虑并比较指向char的指针的值 对1。 现在int是4字节。在大端系统上是00,在小端系统上是01。char只有一个字节,因此转换为char的值将占用num占用的内存的第一个字节。因此,在大端系统上,这将是**00**00 01,在小端系统上,这将是**01**00 00。 现在使用if语句进行比较,以确定转换为char的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

我想你用的是信用证++

&num取整数num在内存中的地址。 它将该地址解释为通过强制转换指向字符的指针 煤焦* 接下来,*char*&num中的第一个asterix考虑并比较指向char的指针的值 对1。 现在int是4字节。在大端系统上是00,在小端系统上是01。char只有一个字节,因此转换为char的值将占用num占用的内存的第一个字节。因此,在大端系统上,这将是**00**00 01,在小端系统上,这将是**01**00 00。 现在使用if语句进行比较,以确定转换为char的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

来吧。将值1赋给一个4字节的int,因此

01 00在little endian x86上 00 01在big endian上

*char*&num==1

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


如果第一个字节为1,则最低有效位位于第一位,为小尾端

开始了。将值1赋给一个4字节的int,因此

01 00在little endian x86上 00 01在big endian上

*char*&num==1

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


如果第一个字节为1,则最低有效位位于第一位,为小尾端

我喜欢你的答案,现在我明白了,但我还有一个问题,为什么在你的例子中一个字节表示为两个零?我最初的想法是,一个字节将被表示为8个零?@Rouke,因为它很容易将一个字节想象为在十六进制值的00到0xFF范围内。当您使用反汇编程序时,您会看到CPU寄存器的格式是十六进制值,而不是十进制值。因为CPU将值的第一个字节转换为char
int跨越4个字节,在您的代码中,更容易想象这样实际发生了什么。@Rouke我最初的想法是,一个字节将表示为8个零,一个字节有8位。所以,如果你用二进制显示一个字节,你确实有00000000个八位。每个0都可以是1,因此最大值可以是11111111,十六进制为0xFF,十进制为255。所以int num将被写成8位的4个二进制块,值为1,它将是00000000000000000000000000000001。我喜欢你的答案,我现在明白了,但我还有一个问题,为什么在你的例子中一个字节表示为两个零?我最初的想法是,一个字节将被表示为8个零?@Rouke,因为它很容易将一个字节想象为在十六进制值的00到0xFF范围内。当您使用反汇编程序时,您会看到CPU寄存器的格式是十六进制值,而不是十进制值。因为在您的代码中,CPU采用转换为字符的第一个字节,即跨4个字节的int值,所以更容易想象这样实际发生的情况。@Rouke我最初的想法是,一个字节将表示为8个零,一个字节有8位。所以,如果你用二进制显示一个字节,你确实有00000000个八位。每个0都可以是1,因此最大值可以是11111111,十六进制为0xFF,十进制为255。因此int num将被写入4个8位的二进制块中,如果值为1,则为00000000000000000000000000000001。