为什么我的编译器在 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。当我使用标题 64位我不明白为什么我的char数据类型只使用8位。它不应该至少使用32位吗(因为我的IDE是32位应用程序),更不用说64位了(因为我在64位机器上编译)? 有人告诉我,存储器地址中使用的位数(1字节)取决于硬件和实现方式。如果是这样的话,为什么我的内存地址仍然只使用8位,而不是更多?<climits>
在C++中编译程序时,我会将宏常量CHAR_BIT
输出到屏幕。它告诉我的字符数据类型中有8位(C++中为1字节)。但是,Visual Studio是一个32位应用程序,我在
我认为您混淆了内存地址位宽和数据值位宽。存储器地址(指针)对于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的内存空间(根据您的操作系统,这个空间可能会更小)。这曾经是一个非常非常大的内存量,但现在可以想象一个程序可能会用完。如果RAM是64位的,CPU也更容易寻址4GB的RAM(这就说明了物理内存和虚拟内存之间的区别)。当然,64位体系结构不仅仅意味着更大的地址,它还带来了许多好处,这些好处对程序来说可能比更大的内存空间更有用。
一个有趣的事实是,在一些处理器上,例如32位ARM,它们的大部分指令都是字对齐的。也就是说,编译器倾向于为任何数据类型分配32位(4个字节),即使所使用的数据类型需要少于4个字节,除非在源代码中另有说明。之所以会出现这种情况,是因为ARM架构已针对使用字对齐的内存访问进行了优化。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 建议在运行时将带有类实例的列表从c++导入qml
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- scanf() 的宽度说明符 - 要使用的字符长度在编译时不固定,仅在运行时确定.如何使其可变?
- 字符* 复制到另一个字符* 运行时错误
- 唯一的字符代码在 Linux 中运行时不起作用,但在 Windows (C++) 中很好
- 为什么我的编译器在 64 位计算机上运行时使用 8 位字符?
- 为什么它会导致运行时错误,字符到整数而不初始化
- 检查平衡分组字符时出现在线判断运行时错误
- 我使用指针分配了一个动态的字符数组,它得到了运行时异常
- 在编译时或运行时将常量字符 * 映射到鸭型 T