欢迎光临本站!

C++中基本数据类型的表现形式

来源:原创    更新时间:2019-08-07 23:17:12    编辑:星谷下载    浏览:356

C++中基本数据类型的表现形式

C++中基本数据类型的表现形式,本节内容根据《C++反汇编与逆向分析技术揭秘》一书总结,其中还有穿插《深入理解计算机系统》第二章浮点数的内容,详细内容参见书中相关章节。



整数类型



在32位计算机中,数据都是以DWORD(双字)的形式存储的。


对于不同的整数类型有不同的存储机制,例如无符号整数的可表示的数值大小要比有符号整数大一倍,有符号整数中负数和正数的表示是不一样的。


不管是有符号还是无符号,在计算机内存中存储的时候都是“小端序”形式存放的,即高字节放在高地址,低字节放在低地址,注意是以字节为单位,而不是以1个位。



>>>>

1、无符号整数


无符号整数在C++中用unsigned int关键字表示,占4字节,32位上的每一位都表示数值,可表示数值范围为:0x00000000~0xFFFFFFFF,十进制表示为:0~4294967295。

 

当无符号整型不足32位时,用0来填充剩余高位,直到占满4字节内存空间为止。

 

因为无符号整数每一位都是用来表示数值的,所以无符号整数在内存中都是以真值的形式存放的。



>>>>

2、有符号整数


有符号整数在C++中用int关键字表示,占4字节,有符号整数最高位用来表示符号,被称为符号位,最高位为0表示正数,反之表示负数。


故被用来表示数值的只有31位,其表示的数值范围为:0x80000000~0x7FFFFFFF


对应二进制表示为:-2147483648~2147483647

 

对于细心的同学可能发现了一个问题,最高位是符号位,0x80000000对应的二进制为 1000 0000 0000 0000 0000 0000 0000 0000,这么一看不应该是 -0 吗?

 

这里先说一下内存中负数是怎么存储的,负数的存储采用了补码的形式,不论是补码还是反码都是根据原码发展而来的。


原码是未经更改的加上左边符号位的二进制码,而补码是数字的绝对值的原码基础上取反加1得到的,现代计算机中用补码表示负数,其优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。

 

按照补码的形式存储负数,如果不考虑0x80000000,最小的负数应该是0x80000001,取反加1后可得到原码为0x7FFFFFFF故0x80000001表示 -2147483647

 

这时候再看 0x80000000 ,他既可以表示 -0,又可以表示 0x80000001 - 1,因为没必要存在两个0的表示形式,所以规定 0x80000000 表示的是 0x80000000 -1 ,即 -2147483648

 

综上,正数范围为 0x00000000~0x7FFFFFFF,负数范围为 0x80000000~0xFFFFFFFF。



浮点数类型



浮点数类型的存储方式可以分为两种:

1、定点实数存储方式

> 小数点的位置固定。如果用4字节存储实数,2字节用来存储整数部分,2字节用来存储小数部分。

> 虽然运算效率高,但是不灵活,如果数据超出2字节就无法存储了。


2、浮点实数存储方式

> 小数点的位置不固定。利用几个二进制位表示小数点位置,称为“指数域”,剩下的表示“数据域”和“符号域”。在计算的时候,先取出指数域,然后分割数据域得到真值,例如:655.35,指数域存储10的-2次方,数据域存储65535,运算的时候拿出来算一下就得到了真值。

> 这种方式的优缺点和定点恰相反,效率低但是灵活。


对于现代计算机,CPU的不断升级革新,浮点实数存储方式已经普及,只有一些嵌入式设备上还能看到定点存储。

 

在 C++ 中,有两种表示浮点数的方式,“float”用4字节表示浮点数,“double”用8字节表示浮点数。


浮点数的运算不会用到通用寄存器,而是通过浮点协处理器提供的浮点寄存器对浮点数进行运算处理。


VC++ 6.0 中在使用浮点数前,都要对浮点寄存器进行初始化,然后才能正常运行。未初始化的时候会报错,例如:

int mian(void)
{
// 未使用到浮点数情况下,
int nInt = 0;
// 在VC++ 6.0 中输入小数会报错,因没有初始化浮点寄存器
scanf("%f", &nInt);
return 0;
}


如果在代码中任意位置定义一个浮点类型的变量,浮点寄存器初始化,就不会报错了。

 

再贴一段代码,看看运行结果:


#include <stdio.h>
void main(void){
int num=9; /* num是整型变量,设为9 */
float* pFloat=(float*)&num; /* pFloat表示num的内存地址,但是设为浮点数 */
printf("num的值为:%d\n",num); /* 显示num的整型值 */
printf("*pFloat的值为:%f\n",*pFloat); /* 显示num的浮点值 */
*pFloat=9.0; /* 将num的值改为浮点数 */
printf("num的值为:%d\n",num); /* 显示num的整型值 */
printf("*pFloat的值为:%f\n",*pFloat); 

评论区

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

相关内容