打印到标准输出时 vector.size() 的奇怪行为

Weird behavior of vector.size() while printing to std output

当我遇到这种行为时,我正在解决一个问题,但无法理解为什么会发生这种情况,我们将不胜感激。

vector<int> v1;
v1.push_back(0);
    
int no = v1.size() - 3;
// this prints output as expected  -> -2
cout << no << endl;
    
// this prints -> 18446744073709551614
cout << v1.size() - 3;

这是关于整数溢出的问题,但我对此一无所知。

标准容器的大小表示为无符号整数(当使用示例中的默认分配器时)。无符号整数只能表示非负数。

当二进制算术运算(在这种情况下为减法)的一个操作数是无符号的(并且至少与 int 一样)并且另一个是相同或更低等级的有符号操作数时,有符号操作数将是转换为无符号类型。操作的结果是相同的类型。

所以,由于运算的结果是一个无符号整数,它不可能是一个负数,因为那些不能用无符号整数表示。发生的事情是操作的“正确”结果超出了可表示的数字。当值低于或高于可表示的值范围时,都会发生这种情况。

当无符号算术运算的“正确”结果超出可表示范围时,您得到的调整结果将是一个与“正确”结果模 M 一致的可表示值,M 是可表示值的个数类型(M == 2位数)。在这种情况下,18446744073709551614 与 -2 模 M.

全等

请注意,当 signed 算法的结果超出可表示值的范围时,程序的行为是未定义的。避免这种情况很重要。