从反汇编角度学C/C++系列目录:
从反汇编的角度学习C/C++之基本数据类型
从反汇编的角度学C/C++之浮点数,结构体与联合体
从反汇编的角度学C/C++之数组,指针及字符串
从反汇编的角度学C/C++之条件判断
从反汇编的角度学C/C++之循环结构
从反汇编的角度学C/C++之函数
从反汇编的角度学C/C++之类的基本概念
从反汇编的角度学C/C++之构造函数与析构函数
从反汇编的角度学C/C++之虚函数,单继承与多态
从反汇编的角度学C/C++之多重继承与多继承
从反汇编的角度学C/C++之虚继承
我们知道在C/C++中,整数类型分为有符号数和无符号数。在数据宽度相同的时候,他们所能表达的范围是不同的。这是因为对于有符号数来说,他使用最高位来表示数字的正负,当最高位为1时是负数,否则为正数。对于int类型数据来说0x00000000到0x7FFFFFFF用来表示整数,而0x80000000到0xFFFFFFFF用来表示负数。
而在内存中的形式究竟如何?考虑如下的代码:
按照定义我们可以知道y被赋值为-1,而x作为无符号数应该是不可以被赋值为-1。
但是经过反汇编以后我们却得到了如下得汇编代码:
可以发现从汇编层面观察,无论是有符号数还是无符号数在内存中的存储数据都是一样的,都是0xFFFFFFFF。这是因为在计算机中,是没有负数表示,所有的负数都是使用补码形式保存,-1的补码是0xFFFFFFFF。
由此可见,在内存存储的数据中,无论是有符号整数还是无符号整数,结果都是一样的。
而对他们的使用我们考虑如下的反汇编代码:
可以看到,无论是有符号数还是无符号数,对于他们的使用是完全一样的。这里我将无符号数x用有符号数%d的方式输出,而将有符号数y用无符号数%x的方式输出。最后得到了如下的结果:
无符号数的x输出了-1,有符号数的y却输出了最大的正数。由此可见,无论是有符号数还是无符号数他们在内存中的存储是完全一样的,至于表现形式如何完全取决于程序员如何使用他们。
我们知道在C/C++中,有字符类型char和整型int。二者的区别是数据宽度的不同,其中char占1个字节,而int占4个字节以及char被我们用来存储字符,而int被我们用来存储数据。那么他们在内存中的表现形式是如何的?考虑如下代码:
我们将字符类型x赋值为整数97,而把整型y赋值为字符类型'a'。最终在内存中的反汇编结果如下:
可以看到在内存中,最终的形式都是将0x61(十进制为97,对应字符'a')的数字赋值到相应的位置。char和int在赋值时候的唯一区别只是数据宽度不同,char赋值时候为byte,而int为dword。
我们在将字符型的x以整型%d输出,而将整型y以字符型%c输出可以得到如下的汇编代码与结果:
可以看到对于他们的使用,从汇编层面看除了数据宽度的不同以外其他完全一样。而最终输出结果如下所示:
作为字符串的x输出了97,而作为整型的y输出了字符'a',由此我们可以得出结果字符型与整型的在内存中的存储与使用是完全一样的只是数据宽度不同而已。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课