先说结论:
- 数据类型可以理解为固定内存大小的别名
- 变量的本质是名字,是内存地址的别名
我们可以通过反汇编查看程序对应的汇编语言,了解其具体实现。
- 让我们先通过下面的例子了解下汇编语言:
void func ()
{
int nA = 0x10;//就是这句了
int nB = 12323;
//......
}
mov dword ptr [ebp-4], 10h
mov 是指令,意思是把数据从“源地址”移动到“目的地址”;
10h 就是“源地址”,只不过这里用了一个常数而不是地址
dword ptr [ebp-4] 就是“目的地址”。
其中,ebp你可以理解为一个指针,ebp-4则是向下4的偏移处(刚好就是nA的地址)。
dword ptr意思是把刚才那个偏移处(nA的地址)解释为双字指针,即指向4个字节的内存空间的指针。
验证:
int main()
{
long a = 4;
int b = 3;
short c = 2;
char d = 66;
long e = b;
e = d;
return 0;
}
反编译:
{
......
long a = 4;
00007FF7748A0F3A mov dword ptr [a],4
int b = 3;
00007FF7748A0F44 mov dword ptr [b],3
short c = 2;
00007FF7748A0F4E mov eax,2
00007FF7748A0F53 mov word ptr [c],ax
char d = 66;
00007FF7748A0F5A mov byte ptr [d],42h
long e = b;
00007FF7748A0F5E mov eax,dword ptr [b]
00007FF7748A0F64 mov dword ptr [e],eax
e = d;
00007FF7748A0F6A movsx eax,byte ptr [d]
e = d;
00007FF7748A0F6E mov dword ptr [e],eax
return 0;
00007FF7748A0F74 xor eax,eax
}
对程序进行反汇编,我们可以有以下结论:
-
对于不同数据类型的变量,汇编语言将其解释为不同的ptr进行处理(取值和写值),如:
char d = 66, // 将66写到地址[d]中,并按照byte ptr处理,即只用单字节进行存储66; e = d; // 则是从地址[d]处取单字节,然后将值写到[e]的地址。
-
机器会生成不同的指令处理不同的数据类型,这是机器层面做的事情
参考:
https://blog.csdn.net/band_of_brothers/article/details/1819228
https://blog.csdn.net/weixin_44395686/article/details/98385910