为什么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。 感谢。
答案 0 :(得分:5)
您似乎正在使用int
和long
具有相同尺寸的平台。 (我已经推断,如果long
能够保存unsigned int
的所有有效值,您将看不到您所看到的行为。)
这意味着在表达式a*z
中,a
和z
都转换为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
时值不会更改。