c中的整数如何存储在内存中?

Sam*_*mes 4 c memory

我以为C中的整数首先存储了最高有效位,例如,数字5将是0...0101。我以为我可以通过强制C让我假装一个特定的内存地址是an,int然后像在那儿一样添加到这些位来操纵特定位int

我试图在内存中设置0的0位,然后尝试将其添加255到不同的内存地址中,这似乎工作得好像最低有效位先于最高有效位存储在内存中,因为当我在内存地址中添加1并更改时我那里的位数更大,而不是较小。如果最高有效位较早地存储在内存中,那么将255高8位是next的开头,那么将其添加到比原地址高1个字节的内存地址根本不会影响该地址int。我想知道我是否正确地解释了这一点,并且整数首先以最低有效位存储。

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main() {
    int *x = malloc(8); //getting 4 memory addresses
    int *y = malloc(8);
    int *z = malloc(8);
    int *a = malloc(8);

    x[0] = 0; //setting 64 bits past memory addresses to 0s
    x[1] = 0;
    y[0] = 0;
    y[1] = 0;
    z[0] = 0;
    z[1] = 0;
    a[0] = 0;
    a[1] = 0;

    *((int*)((int)x)) = 255; //adding to x's memory address
    *((int*)((int)y + 1)) = 255; //adding 1 byte over from y
    *((int*)((int)z + 2)) = 255; //adding 2 bytes over from z
    *((int*)((int)a + 3)) = 255; //adding 3 bytes over from a

    printf("%d\n", sizeof(int));
    printf("%d,%d\n", x[0], x[1]);
    printf("%d,%d\n", y[0], y[1]);
    printf("%d,%d\n", z[0], z[1]);
    printf("%d,%d\n", a[0], a[1]);

    printf("%d\n", x);
    printf("%d\n", &x[1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

4
255,0
0,-16777216
0,16711680
0,65280
12784560
12784564
Run Code Online (Sandbox Code Playgroud)

实际输出:

4
255,0
65280,0
16711680,0
-16777216,0
12784560
12784564
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 5

我认为int中的int首先存储了最高有效位,例如,数字5将为0 ... 0101

不,这取决于您的平台和工具链,而不取决于C。

您描述的方案(几乎)称为big-endian

如今,许多商用PC都是低位字节序的,所以相反(最低有效字节在前)。您可能就是这种情况。

请注意,字节序不是字节,而是字节。

最好不要尝试像这样操作数据。使用语言,使用不关心字节序的逻辑运算。