我试图弄清楚两个具有相同字节大小的变量类型是怎么回事?
如果我有一个变量,它的大小是一个字节。计算机如何能够判断它是一个字符而不是布尔类型变量?甚至是一个字符或一个短整数的一半?
处理器不知道。编译器会这样做,并为处理器生成适当的指令以执行以适当方式操作内存中的字节,但对于处理器本身来说,一个数据字节就是一个数据字节,它可以是任何东西。
语言赋予这些东西以意义,但它是处理器并没有真正意识到的抽象。
计算机无法做到这一点。编译器是。您使用 char 或 bool 关键字来声明变量,编译器生成的代码使计算机以对特定类型有意义的方式处理该变量占用的内存。
例如,一个 32 位整数在内存中占用 4 个字节。为了增加它,CPU 有一条指令说“在这个地址增加一个 32 位整数”。这就是编译器产生的,CPU 盲目地执行它。它不关心地址是否正确或那里的二进制数据。
用于递增变量的指令的大小是另一回事。它很可能是另外 4 个左右的字节,但指令(代码)与数据分开存储。可能会为处理内存中相同位置的程序生成许多指令。由于优化可能会改变用于给定操作的指令数量,因此无法事先正式指定指令的大小。唯一的判断方法是编译你的程序并查看生成的汇编代码(指令)。
另外,看看 C 中的联合。它们允许您将相同的内存位置用于不同的数据类型。编译器允许您这样做并为其生成代码,但您必须知道自己在做什么。
因为你指定了类型。C++ 是一种强类型语言。你不能写$x = 10
。:)
它知道
char c = 0;
是char
因为...好吧,char
关键字。
计算机只能看到 1 和 0。您可以控制变量包含的内容。
您也可以将该数据转换为您想要的任何内容。
char foo = 'a';
if ( (bool)(foo) ) // true
{
int sumA = (byte)(foo) + (byte)(foo);
// sumA == (97 + 97)
}
还要查看数据转换以将内存位置视为不同的数据类型。这可以小到一个字符或整个结构。
一般来说,它不能。看看 的限制dynamic_cast<>
,它试图做到这一点。dynamic_cast
只能在从多态基类派生的对象的特殊情况下工作。那是因为这些对象(并且只有那些对象)中有额外的数据。Chars 和 int 没有此信息,因此您不能dynamic_cast
在它们上使用。