有人能解释一下这个简单的程序在C++中的输出吗?

有人能解释一下这个简单的程序在C++中的输出吗?,c++,c++11,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; retur

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

#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;
}
我希望程序的输出应该是0,但它是-171798692

有人能帮我理解吗?

向量v是空的,所以v.size是0。而且v.size是无符号的,所以从0中减去时会发生奇怪的事情。

问题是v.size-1

该函数返回一个无符号值。当从无符号0中减去1时,得到的不是-1,而是一个非常大的值

然后将这个大的无符号值转换回有符号整数类型,这可能会使其为负值

不仅如此,在64位系统上,size很可能返回一个64位的值,而int保持32位,使数据丢失一半。

返回一个无符号值std::vector::size\u type。这是典型的尺寸

如果您的大小为64位,则无符号值中的算术将环绕,并且v.size-1将是0xFFFFFFFFFFFFFFFFFF18446744073709551615

将该值除以100得到0x28F5C28F5C28F5C 184467440737095516

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


这个值表示-171798692,它是二的补码。

伪结果几乎总是表示一些未初始化的东西,比如向量:-。作为无符号,v.size-1是一个非常大的数字…@Dominique向量是默认构造的。实际上,我不知道怎样才能得到一个未初始化的std::vector@463035818_is_not_a_number我想你可以,但你不应该通过malloc得到一个。@Mikeca很高兴知道这是可能的。我现在要试着再次忘记它:好吧,它缠绕着我。这不是UB,但这是意料之中的,对吧?只有当你忽略实际发生的事情时,这才奇怪。问题的答案应该解释实际发生的情况。顺便说一句,忽略的意思是不知道/不知道,无意冒犯。我被建议将向量大小转换为整数以避免此类问题。@MohamedMagdy转换为带符号整数?是的,int v.size.和C++20保证了模的转换方式,而以前,任何值都是正确的。