奇怪的计算结果

时间:2012-04-01 13:29:08

标签: c++

为什么d在此示例中不等于b

  unsigned int z = 176400;
  long a = -4;
  long b = a*z/1000; //b=4294261
  long c = a*z; // c=-705600
  long d = c/1000; // d =-705

我使用Visual Studio 2008,Windows XP,core2duo。 感谢。

1 个答案:

答案 0 :(得分:5)

您似乎正在使用intlong具有相同尺寸的平台。 (我已经推断,如果long能够保存unsigned int的所有有效值,您将看不到您所看到的行为。)

这意味着在表达式a*z中,az都转换为unsigned long,结果的类型为unsigned long。 (ISO / IEC 14882:2011,5 [expr] / 9 ...“否则,两个操作数都应转换为无符号整数类型,对应于带有符号整数类型的操作数类型。”)

c是将此表达式从unsigned long转换为long的结果,在您的情况下,这会导致实现定义的结果(恰好是负数)为正值签名a*z中无法表示long。在c/1000中,1000转换为long并执行long除法(无双关语),导致long(恰好为负数)存储到d

在表达式a*z/1000中,1000(类型为int的表达式)转换为unsigned long,并且在两个unsigned long之间执行除法,一个积极的结果。此结果可以表示为long,并且在转换为long并存储到b时值不会更改。