整数数据如何以位为单位存储在内存中?不是右对齐吗?

How is an int data stored on the memory in terms of bits? Is it not right-aligned?

本文关键字:内存 右对齐 存储 数据 为单位 整数      更新时间:2023-10-16

当我在C中尝试使用fwrite函数进行一些事情时,我感到非常困惑。

我在这里通读了fwrite的手册 http://www.cplusplus.com/reference/cstdio/fwrite/

它说函数逐个字节写入数组,所以我尝试编写一个整数数组,期望数组中的每个整数最多拆分为 4 个字符。

我认为值的位表示在内存上是右对齐的。也就是说,98('b'的ascii(将存储为

00000000 0000000000000000 01100010

在内存上。所以我希望 fwrite 函数在 txt 文件中写入 ''、'、'、'b'。相反,它写了"b","。

我很困惑,所以我用指针再次测试了它,希望我对内存存储的了解没有错,它只是关于 fwrite 函数。我做了一个整数数组arr,并在其中输入(1<<8(+2,98。

我使用 char 指针将每个整数拆分为四个字节。这是代码。

#include <stdio.h>
int main()
{
int arr[5]={(1<<8)+2, 98, 'c', 'd', 'e'};
char *p = (char*)&(arr[0]);
printf("%d %d %d %d %d %d", arr[0], (int)(*p), (int)(*(p+1)), (int)(*(p+2)), (int)(*(p+3)), (int)(*(p+4)));

FILE *fp;
fp = fopen("TestFile2.txt", "a");
fwrite(arr, sizeof(char), 5, fp);
fclose(fp);
}

程序在控制台上打印"258 2 1 0 0 98","b"用TestFile2(不包括"s"(编写。

据我所知,(1<<8(+2 位表示为

0000000000000000 00000001 00000010 因此程序应该打印 258 0 0 1 2 0。

奇怪的是,结果甚至也不是值的左对齐位表示。

如何在内存上按位存储值?是不是像我想象的那样?或者,我在这里错过了别的东西吗?

任何帮助将不胜感激。

看起来您缺少术语 Endianess。许多系统以"小端序"顺序保存它们的字(32 位系统中的 4 个字节(——即首先是"小端"。这意味着最低有效字节(LSB(是第一个(最低地址(,它从那里上升。这就是为什么 2 是第一个(最低地址,LSB(,1 是第二个,然后是最高有效字节的 0。Endianess仅在操作字节级数据时才重要,但是知道系统使用哪个字节序非常重要。

对齐与它无关 - 单个字节在所有系统中的读取方式总是相同,就像我们通常写数字一样 - 右侧的 LSB。

问题是你(作为人类(如何看待内存,你陷入了内存以0x0000 0x0001 0x002方式显示的陷阱,例如作为内存地址(左边不太重要(,并且为了让您了解 4 字节整数是如何存储在您的系统中的,接下来要做:

int a=0x01020408;
char* c=(char*)(void*)&a;

看看它是如何存储每个字节的;很可能是 c[0]=0x8; c[1]=0x04; c[2]=0x02; 您还可以考虑处理器如何将这 4 个字节的内存加载到寄存器中;最低有效存储器地址加载到最低有效寄存器位中

内存存储中没有"右对齐">这样的概念。 只有大

端序(意味着最高有效字节存储在较低寻址内存中,而最低有效字节存储在较高寻址内存中(和小端序(最低有效字节存储在较低寻址内存中,最高有效字节存储在最高寻址内存中(字节中位的顺序是另一回事。 我看过一些书,其中位是从 1 到 8 的数字,字节中的权重从高到低,还有一些书中的位是 0 到 7 的数字,因为它们在单词中的权重。 另一个问题是,当一个单词中的各个位被序列化为上网时,它们是如何传输的。 一些协议传输最低有效位FIR(主要是RS-232C和以太网(,而其他协议首先传输最高有效位(我认为,但我不确定,USB和CAN总线(

如果使用fwrite(2)编写多字节int则取决于计算机体系结构,以查看通过文件描述符实际传输的字节顺序。 由于fwrite()总是将字节从较低寻址的字节单元写入较高寻址的字节单元,因此只有在您在大端机器中---时,整数的字节才会写入(首先是数字的最大加权字节,然后是数字的最小加权字节(,但如果您在小端机器中,然后您将首先获得权重较小的字节,然后获得权重最大的字节(例如英特尔等(