打印到标准输出时 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 算法的结果超出可表示值的范围时,程序的行为是未定义的。避免这种情况很重要。
当我遇到这种行为时,我正在解决一个问题,但无法理解为什么会发生这种情况,我们将不胜感激。
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 算法的结果超出可表示值的范围时,程序的行为是未定义的。避免这种情况很重要。