博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
printf
阅读量:4153 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
与身俱来的专注力你用到了多少?
查看>>
How to enable the debugfs
查看>>
如何谈一个项目的报价
查看>>
一个项目整个生命周期
查看>>
分布式一致性算法(Paxos&Raft)
查看>>
LeetCode-跳跃游戏 III
查看>>
LeetCode-全排列
查看>>
LeetCode-Count Numbers with Unique Digits
查看>>
LeetCode-最长上升子序列
查看>>
LinkCode-寻找缺失的数
查看>>
LinkCode-翻转二叉树
查看>>
LinkCode-最多有多少个点在一条直线上
查看>>
LinkCode-空格替换
查看>>
LinkCode-最长单词
查看>>
LinkCode-岛屿的个数
查看>>
Java 随机数生成的方法实现与应用-random
查看>>
Properties 文件视图
查看>>
LinkCode- Maximal Square
查看>>
LintCode-O(1)检测2的幂次
查看>>
LintCode-x的平方根
查看>>