我有一个 vector<int> table
和一个整数 index=-833099133
当我写作时
cout<<table.size()<<endl;
cout<< index%table.size()<<endl;
它给了我:
83
81
但是如果我写
cout<<index%83<<endl;
输出结果:
-79
有没有人帮我看看为什么会这样?提前致谢
最佳答案
table.size()
类型为 std::vector<int>::size_type
, 这是一个 unsigned 类型(通常是 std::size_t
),但是字面量 83
是一个 int
已签名。
对有符号和无符号整数执行运算时,有符号整数会隐式转换(“提升”)为无符号值。这会产生一个非负数,它是原始值对 2 的某个幂的模数(使用哪个幂取决于无符号类型的宽度)。在你的情况下,size_t
是 32 位长,所以
-833099133 == 3461868163 (mod 2 ^ 32)
当然,3461868163 % 83
是 81,而 -833099133 % 83
是-79。 (-833099133 mod 83
将是 +4,但在 C++ 中,%
不是模数,而是余数 运算符。)
确实,如果您在 std::size_t
所在的系统上运行以下程序是 32 位长:
#include <iostream>
int main()
{
int idx = -833099133;
int signed83 = 83;
std::size_t unsigned83 = 83;
std::cout << idx % signed83 << std::endl;
std::cout << idx % unsigned83 << std::endl;
return 0;
}
你会得到相同的结果。
关于c++ - 当操作数之一为负值时的模运算c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355556/