1. 程式人生 > 其它 >C++中關於length()返回值問題

C++中關於length()返回值問題

技術標籤:#C++c++

今天在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)。在無符號整數中恰好表示最大值為2^{32}-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中測試,如果採用其他編輯器結果可能不同。