当我在 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 体系结构针对使用字对齐的内存访问进行了优化。
我正在使用 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 体系结构针对使用字对齐的内存访问进行了优化。