有人可以用 C++ 解释这个简单程序的输出吗?

Roh*_*ala 0 c++ c++11

在我们的代码库中调试问题时,我偶然发现了一个与下面的示例问题非常相似的问题

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    int MAX = 100;
    int result = (v.size() - 1) / MAX;
    std::cout << result << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望程序的输出应该是 0 但它是 -171798692。

有人可以帮助我理解这一点吗?

Mik*_*CAT 8

v.size()返回一个无符号std::vector::size_type。这通常是size_t.

算术无符号值环绕,并且(v.size() - 1)0xffffffffffffffff(18446744073709551615),如果您size_t是64位长。

将此值除以100收益率0x28F5C28F5C28F5C(184467440737095516)。

然后,这个结果被转换为int。如果您的int长度为 32 位并且转换是通过简单的截断完成的,则该值将为0xF5C28F5C.

这个值代表-171798692,你得到的,在二进制补码中。