int main(int argc, const char * argv[]) {
printf("%g\n", (double)15/10 );//1.5
printf("%g\n", 25/(double)10 );//2.5
printf("%g\n", 35/10 );//2.5
printf("%g\n", (double)(45/10) );//4
return EXIT_SUCCESS;
}
int main(int argc, const char * argv[]) {
printf("%g\n", 35/10 );//0
return EXIT_SUCCESS;
}
问题
请帮忙解释一下 35/10 的输出?
printf("%g\n", 3 );//0
前言
很高兴看到这样的问题,因为这涉及到现在的人们已经普遍不怎么关心的底层操作。
在人们看来,浮点数和整数就差了一个小数点,但在计算机看来,这里面差别缺非常之大。
这是因为他们的解析方式不同。
证明
这段代码用来输出内存中他们真正的值(十六进制)。
这两句的代码唯一的区别在于他们的类型不同,第一个为
float
,第二个为unsigned int
。在人类看来,他们几乎是一样的,但在内存中,他们完全不可混为一谈。
上面的输出结果为
即,浮点型的3在内存中为
40400000
,整数型的在内存中为3
。怎么样,他们的是不是不一样的?
延伸
那么你认为他们的结果会一致吗?当然不会。它的结果为:
所以
在c语言中
/
运算符不会改变结果类型,也就是说,两个整数型相除的结果也是个整数型。你的代码中就相当于
这当然不会是你期望的。
再次证明
要怎么证明呢?很简单,我们看下反汇编的代码就知道了
修正
我们将上面的代码稍微改一下,只要让编译器认为我们输入的是个小数型就可以了。方法有很多种。