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

Wan*_*ool 1 c++ 64-bit byte bit visual-studio-2013

我正在使用Microsoft Visual Studio 2013 IDE.当我在使用标题时用C++编译程序时<climits>,我将宏常量输出CHAR_BIT到屏幕.它告诉我在我的char数据类型中有8位(在C++中是1字节).但是,Visual Studio是一个32位应用程序,我在64位计算机上运行它(即一台处理器具有64位指令集且操作系统是64位Windows 7的计算机).

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

我被告知存储器地址(1字节)中使用的位数取决于硬件和实现.如果是这种情况,为什么我的内存地址仍然只使用8位而不是更多?

pla*_*dia 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

如何让更多的内存地址位宽有用?

这取决于您需要使用多少数据.一个32位程序最多可以处理4GB的内存空间(根据您的操作系统,这可能会更小).这曾经是一个非常非常大量的内存,但现在可以想象一个程序可能会耗尽.如果它是64位(这涉及物理内存和虚拟内存之间的差异),CPU也可以更容易地处理4GB的RAM.当然,64位架构不仅仅意味着更大的地址,而且带来了许多好处,这些好处可能比更大的内存空间对程序更有用.

  • 这是一个非常好的解释,是的,我混淆了地址位宽和数据值位宽。然而,这两者之间到底是什么关系呢?例如,如果我有一个 32 位地址,并且我为该地址分配了一个 8 位值,这是否意味着有 24 位未使用的地址空间?如果不是,那么内存地址实际使用的位宽是多少?拥有更多的内存地址位宽有何帮助? (2认同)
  • @WanderingIdiot看起来好像你仍然在用他们的地址混淆字节.您没有为*地址*分配8位值,而是将其分配给*,其中该地址指向*.这就像房屋和门牌号码.一个的大小不会影响另一个. (2认同)