当我们在int上进行操作时,结果是暂时存储在int中的结果

When we undertake an operation on an int, is the result temporarily stored in an int?

本文关键字:int 存储 结果 结果是 操作 我们      更新时间:2023-10-16

我在使用C的在线法官上解决了一个问题,我遇到了这个问题。

约束:t< = 10 9
当我宣布t是int时,我得到了一个错误的答案,当我宣布长期很长时间时,答案就被接受了。

该解决方案涉及以下数学计算:

    m = (-3 + sqrt(12*t - 3))/(float)6 ;

我在想12 * t - 3可能被存储在int中,尽管暂时是错误的。有人可以告诉我我是否对吗?

是。计算之前,小于int的类型将升级为int(或unsigned int),但是使用int计算会导致新的int

如果您的结果会溢出int,则最好确保至少一种操作数是一种足够大以保持结果的类型。

如果t是int 12*t是肯定的。C表达中的推断的类型是从自下而上的。这意味着将12*t的(临时)结果存储在32位整数寄存器中,它溢出了限制(约为2e 9左右),您会遇到错误的结果。一个聪明的编译器可能会警告您,因为它可能会从某些情况下会从代码中推断出来。

如果将t声明为 long long,则它的范围高达2^63,提供了8e 18的范围。在这种情况下,表达式12*t也键入long long,并存储在64位寄存器中(或一对32寄存器,如果您的计算机没有64位寄存器),并且该表达式给出了正确的结果。