整数变量与整数字面变化的乘法结果
integer variable versus integer literal changes result of multiplication
我有一个非常有趣的错误,其中.498*2000产生995而不是996 - 但仅当2000将2000存储在整数变量中而不是简单的文字中时。我运行以下代码以确保我不会发疯,评论中显示了变量的结果。Dequeue和Peek是我正在使用的函数,它们返回Int16_t,尽管这似乎并不重要,因为C仍然是价值2000的INT。所有值既通过print语句确认,也可以通过GDB运行。
。int a = buffer.dequeue(); // a = 0
int b = buffer.peek(); // b = 2000
int c = a + b; // c = 2000
float d = .498*2000; // d = 996
int e = static_cast<int>(d); // e = 996
int f = .498*2000; // f = 996
int g = .498*c; // g = 995 WHY??????
我真的不明白这里发生了什么,非常感谢对这个主题的启示。谢谢!
编辑:
阐明了确切发生的事情,简化:我在主文件中运行以下代码:
int a = 2000;
int b = .498*2000;
int c = .498*a;
std::cout << a << " " << b << " " << c << std::endl;
导致以下输出:
2000 996 995
我不明白的是为什么C和B根据2000是字面变量还是整数变量是不同的值。在我看来,在任何一种情况下都应应用相同的圆形或截断。谢谢。
我正在编译以下内容:
g++ -o main.o -g -std=c++0x
我认为差异来自编译时间评估与浮点表达式的运行时间评估。
编译器能够在编译时评估d
。它仅在运行时评估g
。但是,它们不需要导致完全相同的值。
从5.19常数表达式/4:
尽管在某些情况下必须在程序翻译过程中评估常数表达式,但可以在程序执行过程中评估其他表达式。由于该国际标准对浮点操作的准确性没有任何限制(在执行程序中。
最好避免使用此类代码。该标准不能保证此类数字的准确性。结果可能从编译器到编译器各不相同。它们可能会随着相同的编译器而变化,但优化标志不同。
相关文章:
- 序列化,没有库的整数,得到奇怪的结果
- 尝试将字符串/字符转换为整数会产生意外结果
- 取消引用指向整数的指针时获得不同的结果
- AVX2 整数乘以有符号 8 位元素,产生有符号 16 位结果?
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 将较大的整数写为二进制并读回它们会产生不好的结果
- C++,概念不适用于无符号整数作为结果类型?
- 比较整数提升后的结果
- 如何将 xt::sum 表达式结果转换为整数
- 涡轮增压C++结果无法与长整数
- 为什么不同的整数声明会改变结果?
- 我可以将比较结果用作C++的整数吗?
- 为什么使用 int64_t 会产生错误的结果,而双精度则按预期进行简单的整数乘法
- std::reduce 似乎将结果转换为整数
- 从文本文件中读取并使用 sizeof 结果计算整数的数量到 nan
- 整数变量与整数字面变化的乘法结果
- 打印整数指针元素时的结果不同
- 整数异或C++的可能结果
- 如何使用字符串和整数获取汽车类的整数结果
- 在所有声明的双精度但整数结果中打印带有函数的圆的面积,为什么