奇怪的计算结果

weird calculation result

本文关键字:结果 计算      更新时间:2023-10-16

为什么在本例中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。谢谢

看起来您使用的平台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/10001000(类型为int的表达式)被转换为unsigned long,并且在两个unsigned long之间执行除法,从而得到正结果。该结果可表示为long,并且该值在转换为long并存储为b时保持不变。