本文共 855 字,大约阅读时间需要 2 分钟。
void main ( )
{ int d = 100; printf("%f/n", d); printf("%d/n", d); }第一个输出是0.000000,而另一个输出是正确的100。
也就是说,明明是int类型的数据,你非要以float类型去读,那肯定是会出错的,因为int和float在内存中存储的方式是不同的。那你可能有会说:为啥很多情况都是为0呢?要说明这个问题就先要讲解下float的内存存储的的方式:
在c++中float是用四个字节三十二位二进制位来存储,第一位是符号位,后8位是指数位,剩下的是23位有效位。8为指数位有一个是符号位,1表示正,0表示负。
我们看看100的int类型的内存中的值是:0000 0000 0000 0000 0000 0000 0110 0100 这个数按照float类型计算方式得到的值非常小,默认情况下“%f”保留六位有效数字,所以输出会为0.000000,如果不信你可以输出小数点后100000位,绝对是有值的!
unsigned int a = 0xfffffff7;
unsigned char i = (unsigned char)a;
char * b = (char *) &a;
printf("%08x,%08x",i,*b);
1. 大小端问题,在x86架构中,按照小端存储,即低位存低位,高位存高位,a在内存中应该是f7ffffff;
i的值为f7
2. 类型提升。
b指向这样的一个数组 f7 ff ff ff ,*b = f7,但是printf要将类型提升为int,而*b的符号位1,所有扩展所有的位都为1.所以输出为fffffff7
如果是:
unsigned int a=0xfffffff7;
char i=(char)a;
unsigned char j=(unsigned char)a;
printf("%08x,%08x",i,j);
cin>>a;
return 0;
输出fffffff7,000000f7
转载地址:http://hpeti.baihongyu.com/