现在的位置: 首页 > 综合 > 正文

printf

2018年12月13日 ⁄ 综合 ⁄ 共 855字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.