C添加int和float,类型就改变了
我不确定我的理解是否正确C添加int和float,类型就改变了,c,C,我不确定我的理解是否正确 int i = 5; float f = 3.9; int result = i + f; 那么当int和float相加时,8.9变成了8? 这是否意味着将较小的数据类型添加到较大的数据类型时,会以较小的数据类型给出答案 或者这个pringting int是因为它是类型强制转换的,因为结果是用int声明的?如果是这样,这和把(int)放在i+f前面有什么不同 在您的特定情况下,结果是8,因为加法的结果被放入整数中。 您可以将数据类型想象为框,每个数
int i = 5;
float f = 3.9;
int result = i + f;
那么当int和float相加时,8.9变成了8?
这是否意味着将较小的数据类型添加到较大的数据类型时,会以较小的数据类型给出答案
或者这个pringting int是因为它是类型强制转换的,因为结果是用int声明的?如果是这样,这和把(int)放在i+f前面有什么不同 在您的特定情况下,结果是8,因为加法的结果被放入整数中。
您可以将数据类型想象为框,每个数据类型都有一个与之关联的框大小,当添加一个float和一个int时,它们对应的框大小不匹配,一个int可以放在float的框内。这就是为什么逻辑上加法的结果是8.9。不幸的是,你想把这个结果放在一个更小的盒子里,这就导致了你提到的铸造。基本上,大盒子放进小盒子会有问题,你必须扔掉一些东西 按顺序回答您的问题: Q1:添加int和float时,8.9变为8?
答:取决于您将存储它的内容,如果您将结果定义为float,您将得到8.9的结果,否则在您的情况下,小数点后的部分将被丢弃,因为它不能存储在int“框”中 Q2:这是否意味着将较小的数据类型添加到较大的数据类型时,会以较小的数据类型给出答案?
答:不完全是,这也取决于你将存储结果的内容 Q3:这是因为结果是用int声明的,所以它是类型强制转换的吗?
答:是的,这个假设是正确的 Q4:如果是这样,这与将(int)放在i+f前面有什么不同?
答:虽然他们的结果在这个特定场景中是相同的,但在其他场景中,这种差异更有意义。假设使用浮点结果代替int result,则结果中的值将如预期的那样为8.9,但如果要使用此强制转换
(int)(i+f)
您将把加法的结果放入一个较小的框中,从而丢失数据,稍后您将把它放回一个较大的框中,但您已经丢失了一些位,结果中的值将为8.0
通常,您可以安全地将数字数据类型从较小的类型转换为较大的类型,这样您就不会在转换过程中丢失任何位。另一种方法是,如果将float强制转换为int或int强制转换为char等,则可能会得到不好的结果。在C中,当添加两个real1算术操作数时,它们会转换为公共类型:
- 如果任一操作数为
,则另一个操作数将转换为长双精度
,结果为长双精度
长双精度
- 否则,如果任一操作数为
,则另一个操作数将转换为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复数的处理方式与此类似。这是因为将结果存储在int中,这里发生了隐式转换,因为int不能容纳8。9它只能容纳8