整数、浮点数在内存中的存储规则
时间:2020-12-15 09:59:23
[导读]为什么我们代码将浮点数、整数进行强制转换,或打印输出时会出精度损失,或出错的情况? 想要搞明白这个问题,就需要了解一下整数、浮点数的存储规则。
关注+星标公众号,不错过精彩内容
作者 | 夜风
编排 | strongerHuang
嵌入式专栏
根据国际标准IEEE(电气和电子工程协会)规定,任何一个浮点数NUM的二进制数可以写为:
嵌入式专栏
void test(void){float m=134.375;char *a=(char*)&m;printf("0x%p:%d\n",a,*a);printf("0x%p:%d\n",a+1,*(a+1) );printf("0x%p:%d\n",a+2,*(a+2) );printf("0x%p:%d\n",a+3,*(a+3) );}
代码输出结果:
具体的计算过程如下:
嵌入式专栏
我们可以把十进制的小数部分乘以2,取整数部分作为二进制的一位,剩余小数继续乘以2,直至不存在剩余小数为止。
嵌入式专栏
理解了浮点数的存储规则,再理解整数就很简单了。
整数在内存中都是以补码的形式进行存储,整数有正负之分。当需存储有符号数时,用第一位来表示正(0)和负(1)。
正数的反码和补码还是它本身,下面主要讨论下负数的反码和补码。反码是其原码除去最高符号位后其余位按位取反,补码是其反码在加上1 。
void test(void){int8_t n=-123;uint8_t *p=(uint8_t *)&n;printf("%d\n",n);printf("%d\n",*p);}
计算过程如下:
精选汇总 | 专栏 | 目录 | 搜索
精选汇总 | ARM、Cortex-M
精选汇总 | ST工具、下载编程工具
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!





