C++中两个取模函数返回结果不一致,求原因
为什么两个C++取模函数返回不同结果?
你的代码运行后,returnN(text2, -2)返回2,returnN2(text3, -2)返回-2,核心原因是**std::string::size()的返回类型是size_t(无符号整数类型)**,两种写法的类型转换逻辑完全不同:
1. 分析returnN函数
int returnN(string s, int n) { int newN = n % s.size(); return newN; }
这里s.size()返回的是size_t(无符号类型),而参数n是有符号int类型的-2。根据C++的运算规则,当有符号整数和无符号整数混合运算时,有符号整数会被隐式转换为无符号整数:
-2转换为size_t后,会变成该无符号类型的最大值减1(比如32位系统下为4294967294)- 用这个无符号值对字符串长度
12取模,计算得4294967294 % 12 = 2,最终返回2
2. 分析returnN2函数
int returnN2(string s, int n) { int a = s.size(); int newN = n % a; return newN; }
这里先把s.size()的size_t值赋值给int a,由于字符串长度12在int的取值范围内,a最终是有符号int类型的12。
此时n % a是两个有符号整数的取模运算,C++中取模结果的符号与被除数一致,因此-2 % 12 = -2,最终返回-2
验证补充
你可以通过打印类型来确认差异:
cout << typeid(s.size()).name() << endl; // GCC下会输出`m`,对应size_t类型
如果要让两个函数行为一致,要么统一使用有符号整数(比如显式将s.size()转换为int),要么统一用无符号整数处理参数n。
内容的提问来源于stack exchange,提问作者aloysiustanrs
相关产品推荐
相关产品推荐

