我正在使用 Microsoft Visual Studio 2013 IDE。当我使用头文件 <climits>
在 C++ 中编译程序时,我输出宏常量 CHAR_BIT
到屏幕。它告诉我在我的 char 数据类型中有 8 位(在 C++ 中是 1 字节)。但是,Visual Studio 是一个 32 位 应用程序,我在 64 位 机器上运行它(即处理器具有 64 位指令集并运行系统为 64 位 Windows 7)。
我不明白为什么我的 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 的内存空间(根据您的操作系统,这可能会更小)。这曾经是一个非常非常大的内存量,但现在可以想象一个程序可能会用完。如果它是 64 位的,CPU 也更容易寻址更多的 4GB 内存(这就是物理内存和虚拟内存之间的区别)。当然,64 位架构不仅仅意味着更大的地址,而且带来的许多好处可能比更大的内存空间对程序更有用。
关于c++ - 为什么我的编译器在 64 位机器上运行时使用 8 位字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29706867/