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

标签 c++ visual-studio-2013 64-bit byte bit

我正在使用 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/

相关文章:

c++ - 向 MFC 应用程序添加非按钮超链接

git - Visual Studio Team Explorer 丢失了 Visual Studio Online 的 Git 授权

c++ - 使用 Visual Studio 2013 编译 FFTW 3.3.4

c++ - win32 vs2010 空取消引用中的调用堆栈损坏,但 x64 中没有

c++ - Borland C++ Builder 6 上的奇怪链接器错误

c++ - 将多线程类重构为单线程+和多线程

c++ - 如何从给定的 3D map 值中获取所有键?

debugging - WP 8.1-在无法与VS 2013一起使用的设备中调试通用应用

.net - 寻找 32 位 Microsoft 通用控件 (ListView) 的替代品

c# - PostMessage 参数从 32 位 C# 到 64 位 C++