Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C添加int和float,类型就改变了_C - Fatal编程技术网

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