如何在内存中映射整数字面值?



看一下下面的例子:

int a = 130;
char *ptr;
ptr = (char *) &a;
printf("%d", *ptr);

我期望在屏幕上打印一个值0,但令我惊讶的是它是-126。我得出的结论是,由于char是8位,int可能是四舍五入的。

直到现在,我一直认为内存是以msb在左边的方式填充的。但现在一切似乎都很复杂。内存究竟是如何分配的?

在您的情况下a(可能是)4字节的小端值。130是10000010的二进制。

int a = 130; // 10000010 00000000 00000000 00000000 see little endianness here

指向char*

的第一个字节
char* ptr = (char*)&a; // 10000010

并尝试用%d格式打印它,这将打印10000010的带符号整数值,即-126(参见:2的补码)

您的输出提示您的系统是小端序(最低有效字节具有最低内存地址)。

在十六进制中(每个字节正好2位),130写0x82。假设整型为4字节,在小端序系统中,该整数将被存储为0x82,0,0,0。所以*ptr就是(char) 0x82

但是您使用printf来显示它的值。由于传递给第一个参数的所有参数都没有要求的类型,因此char值将被提升为int类型。这里假设一个2补码表示(目前最常见的一种),如果char是无符号的,你将得到130,如果是有符号的,你将得到-126。

TL/DR:在2补数整数表示的小端系统上输出正常,并且char类型是有符号的。

最新更新