扫描关注一起学嵌入式,一起学习,一起成长
为什么我们代码将浮点数、整数进行强制转换,或打印输出时会出精度损失,或出错的情况?
想要搞明白这个问题,就需要了解一下整数、浮点数的存储规则。
根据国际标准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) );
}
代码输出结果:
具体的计算过程如下:
例如0.2可以转换为:
0.2 x 2 = 0.4 0
0.4 x 2 = 0.8 0
0.8 x 2 = 1.6 1
0.6 x 2 = 1.2 1
0.2 x 2 = 0.4 0
0.4 x 2 = 0.8 0
0.8 x 2 = 1.6 1
…
即:.0011001…
整数在内存中都是以补码的形式进行存储,整数有正负之分。当需存储有符号数时,用第一位来表示正(0)和负(1)。
正数的反码和补码还是它本身,下面主要讨论下负数的反码和补码。反码是其原码除去最高符号位后其余位按位取反,补码是其反码在加上1 。
void test(void)
{
int8_t n=-123;
uint8_t *p=(uint8_t *)&n;
printf("%d\n",n);
printf("%d\n",*p);
}
计算过程如下:
原文:https://blog.csdn.net/u014470361/article/details/79820892
文章来源于网络,版权归原作者所有,如有侵权,请联系删除。
关注【一起学嵌入式】,回复“加群”进技术交流群。
觉得文章不错,点击“分享”、“赞”、“在看” 呗!