以下是引用vvvcuu在2015-9-4 23:29:48的发言:
先了解一下整型数据和浮点型数据在内存中的存储方式再来考虑这个问题吧. 强制类型转换仅仅在变量参与运算的那一刻起作用, 并不改变变量原来的类型和数值.
可以试着运行以下代码看看与你自己想想的结果是否一样:
# include <stdio.h>
int main(void)
{
int a=30;
float b=3.0;
float c=0.00000003;
float d=123456789.0;
printf("%f\n%d\n%d\n%d\n",a,b,c,d);
return 0;
}
是不是与自己想的答案有出入?
整型数据1在内存中是这样存储的00000000 00000000 00000000 00000001 //实际是连续的,这里为了方便观察,8位一组加空格了
//当然实际可能还设计补码,移码,反码之类的东西,详细讨论没有益处, 按照原码来理解更方便一些.
如果这个数字表述浮点数的话,那么就麻烦了, 除了一位符号位,8位阶码(指数),还有23位,这23位都在小数点后面啊, 算一下这个数字换成10进制成了多少?
2^(-23)
这个数字直接输出,对于只有6位有效数字的float实在是力不从心.所以它只好给你7个0了.
先了解一下整型数据和浮点型数据在内存中的存储方式再来考虑这个问题吧. 强制类型转换仅仅在变量参与运算的那一刻起作用, 并不改变变量原来的类型和数值.
可以试着运行以下代码看看与你自己想想的结果是否一样:
# include <stdio.h>
int main(void)
{
int a=30;
float b=3.0;
float c=0.00000003;
float d=123456789.0;
printf("%f\n%d\n%d\n%d\n",a,b,c,d);
return 0;
}
是不是与自己想的答案有出入?
整型数据1在内存中是这样存储的00000000 00000000 00000000 00000001 //实际是连续的,这里为了方便观察,8位一组加空格了
//当然实际可能还设计补码,移码,反码之类的东西,详细讨论没有益处, 按照原码来理解更方便一些.
如果这个数字表述浮点数的话,那么就麻烦了, 除了一位符号位,8位阶码(指数),还有23位,这23位都在小数点后面啊, 算一下这个数字换成10进制成了多少?
2^(-23)
这个数字直接输出,对于只有6位有效数字的float实在是力不从心.所以它只好给你7个0了.
例子举得很到位,以上的值输出确实不同,不过自己的基础还没打好,先留着消化几天