第二部分 C++反汇编揭秘
第2章 基本数据类型的表现形式
2.1 整数类型
C++提供的整数数据类型有三种:int、long、short。在Microsoft Visual C++6.0中,int类型与long类型在内存中都占4个字节,short类型在内存中占两个字节。
由于二进制数不方便显示和阅读,因此内存中的数据采用十六进制数显示。一个字节由两个十六进制数组成,在进制转换中,一个十六进制数可用4个二进制数表示,每个二进制数表示1位,因此一个字节在内存中占8位。
在C++中,整数类型又可以分为有符号型与无符号型两种。有符号整数可用来表示负数与正数,而无符号整数则只能表示正数。它们有什么区别?在内存中又如何表示?让我们通过本章的讲解揭开这些谜题。
2.1.1 无符号整数
在内存中,无符号整数的所有位都用来表示数值。以无符号整型数据unsigned int为例,此类型的变量在内存中占4字节,由8个十六进制数组成,取值范围为0x00000000~0xFFFFFFFF,如果转换为十进制数,则表示范围为0~4294967295。
当无符号整型不足32位时,用0来填充剩余高位,直到占满4字节内存空间为止。例如,数字5对应的二进制数为101,只占了3位,按4字节大小保存,剩余29个高位将用0填充,填充后结果为:00000000000000000000000000000101;转换成十六进制数0x00000005之后,在内存中以“小尾方式”存放。“小尾方式”存放是以字节为单位,按照数据类型长度,高数据位对高地址,低数据位对低地址,如0x12345678将会存储为78 56 34 12。相应地,在其他计算机体系中,也有“大尾方式”,其数据存储方式和“小尾方式”相反,高数据位放在内存的低端,低数据位放在内存的高端,如0x12345678将会存储为12 34 56 78。如果大家对此仍有疑问,可以查阅本章小结,我们在小结里专门对此进行了交代。
由于是无符号整数,不存在正负之分,都是正数,故无符号整数在内存中都是以真值的形式存放的,每一位都可以参与数据表达。无符号整数可表示的正数范围是补码的一倍。