字符char
可能大小为一个字节但是当涉及四个字节值时,例如int
,cpu如何将其与整数相差而不是每个字节四个字符?
答案 0 :(得分:4)
CPU执行您所做的代码 此代码告诉CPU如何处理某个内存中的几个字节,例如“取地址0x87367处的四个字节,将它们视为整数并将值加1”。
看,是你决定如何对待记忆。
答案 1 :(得分:1)
一般来说,CPU本身对存储在某些内存位置的值的解释一无所知,它是运行的代码(在这种情况下由编译器生成),它应该知道并使用正确的CPU操纵这些价值观的指示。
以另一种方式说,变量的类型是语言的抽象,告诉编译器生成什么代码来操作内存。
以某种方式做的类型存在于机器代码级别:有各种指令可以处理各种类型 - 即解释存储在内存中的原始值的方式,但这取决于执行的代码使用正确的指令正确处理存储在内存中的值。
答案 2 :(得分:1)
您是否在询问有关CPU设计的问题?
每个CPU机器指令都经过编码,以便CPU知道要操作的位数。
C ++编译器知道为char
发出8位指令,为int
发出32位指令。
答案 3 :(得分:0)
编译器有一个名为“symbols table”的表,因此编译器知道每个var的类型以及它应该如何看待它。
答案 4 :(得分:0)
这取决于架构。大多数系统使用IEEE 754 Floating Point Representation和Two's Compliment作为整数值,但这取决于所讨论的CPU。它知道如何将这些字节恰当地转换为“值”。
答案 5 :(得分:0)
在CPU方面,这主要涉及两件事:寄存器和指令集(例如,查看x86)。
register只是最接近CPU的一小块内存。将值放在那里并用于执行基本操作。
指令集将包含一组固定名称(如EAX,AX等),用于寻址寄存器上的存储器插槽。根据名称,它们可以指更短或更长的时隙(例如8位,16,32,64等)。对应于那些寄存器,存在对特定大小的寄存器值起作用的操作(如加法,乘法等)。 CPU如何实际执行指令甚至存储寄存器是不相关的(由CPU制造商决定),并且程序员(或编译器)可以正确使用指令集。
CPU本身不知道它正在做什么(它不是“智能”)它只是根据请求进行操作。编译器是跟踪变量类型的编译器,并确保程序生成并稍后执行的指令与您编码的内容(称为“编译”)相对应。但是一旦程序被编译,CPU就不会“跟踪”类型或大小或类似的东西(这样做太昂贵了)。由于编译器几乎可以保证生成一致的指令,因此这不是问题。当然,如果您在汇编中编写自己的代码并使用了不匹配的寄存器和指令,那么CPU仍然无关紧要,它只会让您的程序表现得非常奇怪(可能会崩溃)。
答案 6 :(得分:0)
在内部,CPU可以被连线以获取整数的32位,这转换为4个8位八位字节(字节)。 CPU不会将提取视为4个字节,而是32位。
CPU也在内部连线,为字符(字节)提取8位。在许多处理器体系结构中,CPU从存储器中取出32位,并在内部忽略未使用的位(保持最低的8位)。这通过仅需要32位的提取来简化处理器架构。
在高效平台中,内存也可以32位数量访问。从内存到处理器的数据流通常称为数据总线。在本说明书中,它将 32位宽。
其他处理器架构可以为字符获取8位。这使得处理器无需忽略32位读取中的3个字节。
一些程序员以字节宽度而不是位来查看整数。因此,32位整数将被视为4个字节。这可能会产生混淆,尤其是位排序,a.k.a. Endianess。某些处理器的第一个字节包含最高有效位(Big Endian),而其他处理器的第一个字节代表最低有效位(Little Endian)。这会在平台之间传输二进制数据时出现问题。
知道处理器的整数可以容纳4个字节并且一次取4个字节,许多程序员喜欢将4个字符打包成一个整数以提高性能。因此,处理器需要1个4个字符的读取而不是4个4个字符的读取。从整数中打包和解包字符所需的执行时间可能会浪费性能提升。
总之,我强烈建议您忘记组成整数的字节数以及与字符数或字节数的任何关系。此概念仅适用于少数嵌入式平台或少数高性能应用程序。您的目标是在给定的持续时间内提供正确且健壮的代码。性能和尺寸问题都在项目的最后阶段,只有在有人抱怨的情况下才会出现问题。如果你专注于整数的范围和限制而不是它占用多少内存,那么你的职业生涯会很好。