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