整数数据如何以位为单位存储在内存中?不是右对齐吗?
How is an int data stored on the memory in terms of bits? Is it not right-aligned?
当我在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()
总是将字节从较低寻址的字节单元写入较高寻址的字节单元,因此只有在您在大端机器中---时,整数的字节才会写入(首先是数字的最大加权字节,然后是数字的最小加权字节(,但如果您在小端机器中,然后您将首先获得权重较小的字节,然后获得权重最大的字节(例如英特尔等(
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 64位机器上的C++内存对齐
- 使 std::vector 分配对齐内存的现代方法
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- Linux C++ 中的页面对齐内存分配
- 整数数据如何以位为单位存储在内存中?不是右对齐吗?
- C++ 如何格式化包含可变整数的文本行,使其在给定宽度内右对齐?
- 右对齐三角形的间距
- 如何使用 cout 将文本右对齐
- C 输出中的总右对齐
- 数据是否在放置新分配的内存中对齐
- c++:右对齐的字段输出
- Html文本作为工具提示,向右对齐
- 如何为第一个组件右对齐
- Kcachegrind显示内存未对齐
- 关于指针对齐,有没有一种方法可以使指针与给定的内存边界对齐
- Emacs 右对齐')'
- 第一个带有double的集合是左对齐的,随后的都是右对齐的