今天在寫某個程序需要對兩個數字字符串進行相加操作,比如字符串1是"12345",字符串2是"23456"。需要字符串1中的"1" 和字符串2中的"2"相加,就是兩個字符相同位置的數進行相加;以此類推。
這個一看很好完成,寫一個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代碼