1. 程式人生 > 實用技巧 >警惕char型別直接相加

警惕char型別直接相加

今天在寫某個程式需要對兩個數字字串進行相加操作,比如字串1:12345,字串2:23456。需要1和2相加、2和3相加。就是兩個字元相同位置的數進行相加。

這個一看很好完成,寫一個for,然後取字串中每個字元進行相加即可。

比如如下程式碼:

string a= "12345";
string b= "23456";
string sum = "";
for (int i = 0; i < a.Length; i++)
{
    sum += a[i] + b[i];
}

心想結果應該是:357911

實際結果是:99101103105107

初一看是不是有點奇怪,這個結果也不像是字元累加的結果,如字元1+字元2,如果是這樣那結果應該也是:1223344556。

難道資料型別問題?轉換int再相加試試?

如果下圖結果還是一樣

其實編譯器已經告訴你了這裡的型別轉換是多餘的,所以(int)顏色變暗了。

當時想這是為什麼?隨即我把字串a和b都換成字元不再使用數字試試。

如下圖所示

心想這下輸出結果總應該是:abbccddeeffg

實際結果:195197199201203205

看到這個瞬間明白了,char實際儲存可能本身就是一個數字,這個數字就是該字元對應的十進位制ASCII碼。

然後我就找到ASCII碼對應表,一看果然是這樣

我們回到前面的字串12345相加的那個問題上,看看。實際上程式相加的是1對應的ASCII+2對應的ASCII,以此類推。

1對應49,2對應50。49+50=99。所以最開始123456字元相加的的結果是99開頭的。(99101103105107)

我們看下1-9對應的ASCII

所有char相加一定要單獨轉換成字元再進行處理。

當我們第一眼感覺sum += a[i] + b[i]或者sum += (int)a[i] + (int)b[i],就能實現數字的相加,可能原因在於我們平時使字串要取單個字元時比如a[i],他輸出顯示確實是1,而不是ASCII碼對應的49。

我們將程式碼改下對char字元不參與運算只輸出,並看輸出結果

我們看結果是12345,直接按照字元輸出了。並不是輸出ASCII碼,我想可能是編譯器進行優化導致的,畢竟輸出ASCII意義不大。

針對這個問題我還嘗試其他語言,Java也是一樣的。但是JS不會,JS不會按照ASCII碼進行相加。

Java程式碼

JS程式碼