C++中關於length()返回值問題
阿新 • • 發佈:2021-02-10
今天在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中測試,如果採用其他編輯器結果可能不同。