c语言数据类型算术规则

ggk*_*ath 3 c

在c编程中,如果我在下面的等式中使用变量k,X,Y,n(其中exp()是数学常量e提高到(),pi = 3.14159 ...,并且j = sqrt(-1) )并且这些变量都被声明为64b双精度浮点数(其中X是复数),输出的结果也将是这种数据类型.

output = k * exp(2*pi*j*X*Y/n)
Run Code Online (Sandbox Code Playgroud)

现在,如果我想尝试更智能地管理内存,我想做

k,Y和n为32位无符号长整数int(0到4294967295),和

pi,j和X为32位浮点数.

我的问题是,输出的结果是数据类型float(希望是)还是unsigned long int?也就是说,C语言是否有一些默认规则可以智能地将浮点数和整数相乘并将结果作为float返回,或者我必须使用类型转换等手动管理它?只是想知道在这样的操作中是否有任何我需要担心的事情,或者我是否可以将它留给C来在幕后智能地做所有事情.

nro*_*bey 8

当使用浮点数和整数进行算术运算时,它总是将它强制转换为浮点数.也就是说:

  • float*float = float
  • float*int = float
  • int*float = float
  • INT*INT = INT

如果所有值都是整数,则只会收到"整数数学".


Jer*_*fin 5

这可能会变得难看.编译器查看单个操作的操作数类型,并将两者都提升为"更大"类型(例如,如果一个是int另一个double,它将转换intdouble,然后执行操作).

在您的情况下,这可能会有一些意想不到的结果.现在你有:2*pi*j*X*Y/n.运算符从左到右分组,所以这相当于((((2*pi)*j)*X)*Y)/n.在这种情况下,这可能会相当合理 - "第一"操作中的一个操作数是浮点数,因此所有其他操作数将根据需要转换为浮点数.但是,如果重新排列操作数(即使在正常数学中看起来相当的方式),结果也可能完全不同.只是举例,如果你重新安排它2*Y/n*pi*j*X2*Y/n部分将被使用做整数算术,因为2,Yn都是整数.这意味着除法将在整数上完成,给出整数结果,并且只有获得整数结果之后,才能将该整数转换为浮点数乘以pi.

底线:除非你正在处理大型数组之类的东西,所以转换为较小的类型可能真的可以节省相当多的内存,如果可能的话,你通常会更好地保留相同类型的所有操作数.我还要注意,在这种情况下,你试图"智能地管理内存"可能无论如何都不会有任何好处 - 在典型的当前机器上,a long int和a float都是32位,所以它们都使用相同的量记忆无论如何.另请注意,exp将a double作为其操作数,因此即使您float对其余部分进行数学运算,它也会被提升为a double.还要注意的是,从转换intfloat(和背面)可能相当缓慢.

如果你真的只处理了六个变量左右,你几乎肯定最好不要让它们double完成它并完成它.转换成的组合float,并long可以节省大约14字节的数据存储,但再加入(约)14个字节的额外的指令来处理所有的转换之间int,float以及double在正确的时间,所以你会慢的代码最终是无论如何都要使用尽可能多的内存.