为什么我的编译器在 64 位计算机上运行时使用 8 位字符?



我正在使用Microsoft Visual Studio 2013 IDE。当我使用标题<climits>在C++中编译程序时,我会将宏常量CHAR_BIT输出到屏幕。它告诉我的字符数据类型中有8位(C++中为1字节)。但是,Visual Studio是一个32位应用程序,我在

64位我不明白为什么我的char数据类型只使用8位。它不应该至少使用32位吗(因为我的IDE是32位应用程序),更不用说64位了(因为我在64位机器上编译)?

有人告诉我,存储器地址中使用的位数(1字节)取决于硬件和实现方式。如果是这样的话,为什么我的内存地址仍然只使用8位,而不是更多?

我认为您混淆了内存地址位宽和数据位宽。存储器地址(指针)对于32位程序是32位,对于64位程序是64位。但数据类型的值有不同的宽度,这取决于类型(由标准管理)。因此,char是8位的,但如果您是作为32位应用程序进行编译,则char*将是32位的(请注意,这取决于您如何编译应用程序,而不是您运行的处理器或操作系统类型)。

编辑问题:

然而,这两者之间的关系是什么

无论存储什么数据值,内存地址都将始终具有相同的位宽。

例如,如果我有一个32位地址,并且我为该地址分配了一个8位值,这是否意味着有24位未使用的地址空间

一些代码(假设32位编译):

char i_am_1_byte = 0x00;         // an 8-bit data value that lives in memory
char* i_am_a_ptr = &i_am_1_byte; // pointer is 32-bits and points to an 8-bit data value
*i_am_a_ptr = 0xFF; // writes 0xFF to the location pointed to by the pointer
// that is, to i_am_1_byte

因此,我们有i_am_1_byte,它是一个字符,在内存中的某个处占用8位。我们可以使用运算符&的地址来获取这个内存位置,并将其存储在指针变量i_am_a_ptr中,这是您的32位地址。我们可以通过取消引用将8位数据写入指向i_am_a_ptr的位置

如果不是,实际用于的内存地址的位宽是多少

程序使用的所有数据都必须位于内存中的某个位置,并且每个位置都有一个地址。大多数程序可能不会使用大部分可用内存,但我们需要一种方法来寻址每个可能的位置。

拥有更多的内存地址位宽有什么帮助

这取决于您需要处理多少数据。一个32位程序最多可以寻址4GB的内存空间(根据您的操作系统,这个空间可能会更小)。这曾经是一个非常非常大的内存量,但现在可以想象一个程序可能会用完。如果RAM是64位的,CPU也更容易寻址4GB的RAM(这就说明了物理内存和虚拟内存之间的区别)。当然,64位体系结构不仅仅意味着更大的地址,它还带来了许多好处,这些好处对程序来说可能比更大的内存空间更有用。

一个有趣的事实是,在一些处理器上,例如32位ARM,它们的大部分指令都是字对齐的。也就是说,编译器倾向于为任何数据类型分配32位(4个字节),即使所使用的数据类型需要少于4个字节,除非在源代码中另有说明。之所以会出现这种情况,是因为ARM架构已针对使用字对齐的内存访问进行了优化。

相关内容

最新更新