数据类型的本质

先说结论:

  • 数据类型可以理解为固定内存大小的别名
  • 变量的本质是名字,是内存地址的别名

我们可以通过反汇编查看程序对应的汇编语言,了解其具体实现。

  1. 让我们先通过下面的例子了解下汇编语言:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值