我不确定我的理解对不对
int i = 5;
float f = 3.9;
int result = i + f;
然后在添加int和float时,8.9变成8? 这意味着在将较小的数据类型添加到较大的数据类型时给出较小数据类型的答案吗?
还是此pringing int是因为类型转换是因为在int中声明了result?如果是这样,这与将(int)放在i + f前面有什么不同?
答案 0 :(得分:2)
在C中,当添加两个实数 1 算术操作数时,它们将转换为通用类型:
long double
,则另一个转换为long double
,结果为long double
。double
,则另一个被转换为double
,结果为double
。float
,则另一个被转换为float
,结果为float
。因此,在您的i + f
中,i
转换为float
,将值相加,结果是float
。
然后将其分配给int
。在赋值时,该值将转换为目的地的类型。因此,float
的总和将转换为int
。
用于转换算术操作数的规则称为“常规算术转换”,并在C 2018 6.3.1.8中进行了指定。分配规则在C 6.5.16.1中指定。
1 复数的处理方式类似。
答案 1 :(得分:1)
在您的特定情况下,结果为8,因为加法的结果放入一个整数中。
您可以将数据类型想象成盒子,每种数据类型都有与之关联的盒子大小,同时添加一个float和一个int,它们对应的盒子大小不匹配,可以将int放置在一个float盒子内。这就是为什么逻辑上相加结果为8.9的原因。不幸的是,您希望将此结果放到一个较小的框中,这会导致您提到的转换。基本上,大箱子放到小箱子里会遇到问题,您必须摆脱一些东西。
按顺序回答您的问题:
Q1 :添加int和float时,8.9变为8?
答:取决于您要存储的内容,如果将结果定义为float,则将获得8.9结果,否则您将删除deciaml点后的部分,因为它不能存储在int“ box”中。
第二季度:这是否意味着在将较小的数据类型添加到较大的数据类型时给出较小数据类型的答案?
答:并非如此,再次取决于您要存储的结果。
第3季度:这是因为int声明了结果而强制转换了int类型吗?
答:是的,这种假设是正确的。
第4季度:如果是这样,与将(int)放在i + f前面有什么不同?
答:虽然在特定情况下它们的结果相同,但在其他情况下,差异更有意义。想象一下,如果有一个而不是int结果的float结果,那么result的值将是预期的8.9,但是如果您要使用此强制类型转换(int)(i+f)
您会将加法的结果放到一个较小的框中,从而丢失数据,稍后再将它放回一个较大的框中,但是您已经丢失了一些位,结果值为8.0。
通常,将数字数据类型从较小的数据类型转换为较大的数据类型是安全的,这样一来您就不会丢失任何位。相反,如果将float转换为int或将int转换为char等,则可能会得到不好的结果。