C++:奇怪的除法输出

Posted

技术标签:

【中文标题】C++:奇怪的除法输出【英文标题】:C++: strange division output 【发布时间】:2019-12-20 01:03:55 【问题描述】:

我有以下代码:

    int x = arr[arr.size() -1] - arr[0];
    int n = arr.size();
    int dx = x/n;
    int dy = (arr[arr.size() -1] - arr[0])/arr.size();
    std::cout << dx << "  " << dy << std::endl;

当我的arr = [15, 13, 12],我得到dx = -1,但是dy = 1431655764arr is vector&lt;int&gt;

为什么dxdy 不同?谢谢!

【问题讨论】:

您的代码不完整 - 但我怀疑您正在做一些未定义的行为。 - 添加环绕代码。 【参考方案1】:

为什么dxdy 不同?

对于dy,注意std::vector::size的返回类型是std::vector::size_type,是一个无符号整数类型。那么(arr[arr.size() -1] - arr[0])/arr.size() 的结果也是无符号的。结果是overflowed,然后分配给dy,类型为int

无符号整数运算总是执行模2n 其中 n 是该特定整数中的位数。例如。对于unsigned int,将UINT_MAX 加一得到​0,从​0​ 减去一得到UINT_MAX

对于dx,首先将arr.size()赋值给n(其类型为int),然后计算为x/n,其结果也是int。然后将结果分配给dx,一切正常。

【讨论】:

为什么 dx 和 dy 不同?” - 作为标题和细分来解释它很好。

以上是关于C++:奇怪的除法输出的主要内容,如果未能解决你的问题,请参考以下文章

为啥GCC在实现整数除法时使用乘以一个奇怪的数字?

一个基础而奇怪的问题:算法执行加法乘法除法性能无区别?

oracle apex 奇怪的零除法问题

使用 PHP number_format() 得到一个奇怪的除法错误

为啥除法后我的 double 或 int 值始终为 0?

C++:模拟定点除法/乘法