奇怪的计算结果
weird calculation result
为什么在本例中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。谢谢
看起来您使用的平台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
时保持不变。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 计算幂级数的数学结果不正确
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 在Javascript和C++中计算MD5哈希的不同结果
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- WebGL2 和 C++ 上的浮点计算结果不同
- 术语的计算结果不是采用0个参数的函数
- C++编译器能在编译时计算出文字的除法结果吗
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- 在C++中,是否可以编写一个条件的lambda,即只是一个计算结果为真或假的条件
- C++ 函数指针的计算结果为 1
- 为什么 02000 的计算结果为 1024
- 为什么这两个相似的代码计算行列式的结果不同?
- C++ openmp 并行计算计算错误的结果
- 如何让编译器忽略这个计算结果为 false 的 if-constexpr?
- 从文本文件中读取并使用 sizeof 结果计算整数的数量到 nan