【发布时间】:2020-04-15 01:50:41
【问题描述】:
请解释为什么代码的第一个 sn-p 不会导致 -1。
string s = "abc";
int amount = -1;
cout << "amount to shift before modulus: " << amount<<endl;
amount %= s.size();
cout << "mod " <<s.size()<<endl;
cout << "amount to shift after modulus: " << amount<<endl;
输出:
模数前的偏移量:-1
模组 3
模数后移位量:0
string s = "abc";
int sSize = s.size();
int amount = -1;
cout << "amount to shift before modulus: " << amount<<endl;
amount %= sSize;
cout << "mod " <<sSize<<endl;
cout << "amount to shift after modulus: " << amount<<endl;
输出:
模数前的偏移量:-1
模组 3
模数后的位移量:-1
当我遇到这种行为时,我正在完成编码挑战,但我不明白发生了什么。如果金额为正数(例如 1),则不会发生此行为。
【问题讨论】:
-
我计算了数字,这是真的,这就是二进制补码数学在 64 位平台上的结果。然而,解释这里发生的事情只会鼓励更多由那些无用的在线上下文网站产生的这类问题,而那些低质量的问题真的应该被劝阻。这里的噪音已经太大了。
-
@Sam:这个问题是通常算术转换的结果。我找不到似乎合适的副本,而且我认为这个问题不够明显,需要回答。
-
对不起,让我澄清一下。问题是 -1 mod 3 和 -1 mod s.size() 之间的差异(也是 3)导致两个不同的结果。
-
@calamari:是的,3 在两种计算中是相同的。不同的是 -1。