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) 

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

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

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

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

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

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

底线:除非你正在处理像大型数组这样的东西,所以转换为较小的类型可能真的可以节省相当多的内存,如果可能的话,你通常会更好地保留相同类型的所有操作数。 我还要注意,在这种情况下,你“智能地管理内存”的尝试可能无论如何都不会有任何好处 – 在典型的当前机器上, long intfloat都是32位,所以他们都使用在任何情况下都相同的内存量。 另请注意, exp采用double作为其操作数,因此即使你为其余的操作float数学,它也会被提升为double 。 另请注意,从intfloat (和back)的转换可能相当慢。

如果你真的只处理了六个左右的变量,你几乎肯定最好把它们留下来并且完成它。 转换为floatlong的组合将节省大约14个字节的数据存储空间,但随后添加(大约)14个字节的额外指令以在正确的时间处理intfloatdouble之间的所有转换,因此您将结束使用较慢的代码,无论如何都要使用尽可能多的内存。

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

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

如果所有值都是整数,则只会收到“整数数学”。

C语言中的“常规算术转换”在浮点数上的工作方式如下:

  • 如果两个操作数的类型相同,那么一切都很好。
  • 如果一个是双,另一个是双。
  • 否则,如果一个是浮动的,另一个转换为浮动。
  • 否则,如果它们都是整数,则适用“整数促销”的各种规则。

数字常量“1”被视为int。 数字常量“1.0”被视为双精度。 数字常量“1.0f”被视为浮点数。