鉴于以下ANSI C代码,我想知道结果:
main() {
int a = 19.4 / 9.7; // result = 2
float b = (int) 19.4 / (int) 9.7 // result = 2.000000, why?
float c = (int) 9.7; // result = 9
}
我知道C会在转换为int时切断所有小数位,但如果我看到第二行,我的逻辑就会有缺陷。如果小数位被切断,则结果必须为2.11111。
如何在ANSI C中完成浮点转换?
答案 0 :(得分:4)
在标准C中,除非另有说明(例如19.4F,9.7F),否则假定文字如19.4和9.7是双倍的。
编译器将使用整数除法函数来计算x / y(如果x和y都是int(兼容)类型)或浮点除法函数到计算机x / y,如果x和y中的至少一个是浮点类型。
float b =(int)19.4 /(int)9.7 // result = 2.000000,为什么?
你要求将19.4转换为int,并将9.7转换为int,有效地要求编译器计算19/9 = 2的整数除法,然后将其提升为float以便存储在b中。 2变为2.0。
.PMCD。
答案 1 :(得分:4)
在第2行中,您将输入值转换为整数,然后进行整数除法(因为除法的两个操作数都是整数,除法是在整数空间中完成的 - 这意味着任何小数生成都将被截断)。
所以,19/9 = 2
然后,要将此整数转换为float,它会隐式地将2转换回2.000000
答案 2 :(得分:1)
不,它必须是2.当你用int分割int时,你得到一个int。因此2.您可以将hokey-pokey转换为您喜欢的任何内容,但小数已经消失。
答案 3 :(得分:1)
除以两个整数,你将得到一个整数。除了一个浮点数和一个整数,你将得到一个浮点数。
答案 4 :(得分:1)
(int) 19.4 / (int) 9.7
相当于19 / 9
,它首先被解析为2(一个int)。只有在计算出2之后,它才会变成浮点变量类型。