打印到std输出时vector.size()的异常行为



当我遇到这种行为时,我正在解决一个问题,无法理解为什么会发生这种行为,如果有任何帮助,我们将不胜感激。

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==2比特数(。在这种情况下,18446744073709551614与-2模M一致。


注意,当符号算术的结果在可表示值的范围之外时,程序的行为是未定义的。重要的是要避免这种情况。

相关内容

最新更新