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

Why does my compiler use an 8-bit char when I'm running on a 64-bit machine?

我正在使用 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 位(另请注意,这取决于您编译应用程序的方式,而不是什么类型的处理器或 OS 你正在 运行ning on).

编辑问题:

但是,这两者之间是什么关系呢?

无论存储什么数据值,内存地址总是具有相同的位宽。

例如,如果我有一个 32 位地址,我为该地址分配了一个 8 位值,是否意味着还有 24 位未使用的地址 space?

部分代码(假设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 内存 space(根据您的 OS,这可能更小)。那曾经是非常非常大的内存量,但是现在可以想象一个程序可以 运行 出来。如果它是 64 位的,CPU 寻址更多的 4GB RAM 也容易得多(这就是物理内存和虚拟内存之间的区别)。当然,64 位架构不仅仅意味着更大的地址,而且带来的许多好处可能比更大的内存对程序更有用 space.

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