gpt4 book ai didi

c++ - 奇怪的计算结果

转载 作者:IT老高 更新时间:2023-10-28 23:02:09 25 4
gpt4 key购买 nike

为什么在这个例子中 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/1000 中,1000(int 类型的表达式)被转换为 unsigned long 并且在两个 unsigned long 之间执行除法,得到肯定的结果。此结果可表示为 long,并且在转换为 long 并存储到 b 时该值不变。

关于c++ - 奇怪的计算结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com