今天在AC一道编程题目时,出现了这样一个关于C++中length()函数的用法的问题。测试代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1="1234567";
string s2="12345678";
cout<<s1.length()-s2.length()<<endl;
return 0;
}
以上述代码为例,都知道s1.length()和s2.length()分别返回字符串的长度,所以上述代码中s1.length()-s2.length()会返回两个字符串的长度差,即-1。但最终得到的结果是:
在这里我们往往容易忽略的是返回的长度值的数据类型为unsigned(32位),即无符号整数,在上面的测试数据中,s1.length()-s2.length()=-1,计算机中存储器中负数采用补码表示,-1的二进制补码为:1111...1(共32个1)。在无符号整数中恰好表示最大值为-1=4294967295。为了更好的验证,选择如下测试程序进行验证。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1="1234567";
string s2="12345689";
cout<<(int)(s1.length()-s2.length())<<endl;
cout<<s1.length()-s2.length()<<endl;
unsigned a=1,b=2;
cout<<(int)(a-b)<<endl;
cout<<a-b;
return 0;
}
运行结果如下:
s1.length()-s2.length()返回值在有符号数中表示-1,而在无符号数下表示最大值。运算结果与直接采用数值运算的方法相同。
注:上述程序均在codeblocks中测试,如果采用其他编辑器结果可能不同。