http://blog.csdn.net/happymawolf/article/details/6327776
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