郭建軍
(長治學院計算機系,山西長治046011)
?
C程序設計下整數取值范圍的擴充和運算的改進
郭建軍
(長治學院計算機系,山西長治046011)
文章介紹了在C語言程序設計中整數取值范圍擴充的方法,并對擴充后整數參加的加、減、乘、除、求余數運算進行了相應的改進,利用改進的運算,可以求解數據取值超出C語言環境規定范圍的問題。
整數;擴充;運算;改進;
目前,C語言已經成為大多數程序設計者必須掌握的一種程序設計語言。通過系統的學習,既可掌握程序設計的基本算法、編程方法等內容,也可通過程序設計的方法去解決一些具體的問題。但不同的程序設計系統都有自身規定,在C語言程序系統下對整數的運算和取值范圍就有嚴格的規定,如果在程序設計中整數的取值超出規定范圍或運算后的值超規定范圍,運算的結果就會出現異常。如果在處理實際問題時,整數的取值超出規定范圍,就需要對整數取值進行擴充,對參加的運算進行改進,才能得到正確的結果。
在C語言程序設計系統下,整數存儲所占空間的大小是用字節數來表的,如VC++6.0下整型int 為4個字節,即32位的二進制數。因為占用內存空間的字節數是固定的,所以整型int的取值范圍也是固定的。經過二進制數轉換為十進數的運算,可計算出整型int的取值范圍為-2147483648~2147483647[1],無符號整型unsigned的取值范圍為0~4294967295[1]。下面程序的執行結果變化就是整數運算結果超過取值范圍而造成的。
程序1:負整數加-1變正整數,正整數加1變負整數。
程序執行結果為:x=-2147483648[2],y=2147483647
程序2:無符號整數加1變0,無符號整數0減1變正數。

程序執行結果為:x=0,y=4294967295[2]
以上第一個程序中變量x,y的取值,恰好是整型int的最大值和最小值,第二個程序中變量x,y的取值,恰好是無符號整型unsigned的最大值和最小值。在進行加1和減1運算后,運算的值超過了規定的范圍,因此才有了上面程序執行后的輸出結果。
在處理具體問題時,如果用到的整數比較大,肯定會超出C語言程序設計環境下規定的范圍,如果不對數據取值范圍進行擴充,不對數據參加的運算作相應的改進,計算的結果就會異常,即程序運行輸出錯誤的結果,實際問題得不到解決。
3.1整數取值范圍的擴充
C語言程序設計下的構造型數據類型數組[3],一經定義,數組中的元素有統一的數據類型,且占有連續的存儲單元,可用下標引用元素。由于數組具有這些特點,所以可用數組擴充整數的取值范圍。程序中定義字符型一維數組和整型一維數組,定義多少個元素,就可存放多少位數,用整體輸入字符串的函數gets()從鍵盤一次輸入一個整數,存入字符型數組中。為了使保存在字符串中的整數能參加運算,還需經過字符變數字的轉換[3],然后存放到一維整型數組中,其中用下標為0的元素存放個位上的數字,下標為1的元素存放十位上的數字,以此類推。
3.2數字字符串轉換為整數程序段

通過以上程序段,可以把數字字符串表示的整數轉換為數字,并按下標為0的元素存放個位上數字的規律存入一維整型數組中。
把字符型的一維數組轉換為整數后,相等于把一個整數的各位數字進行了分離,利用C語言程序設計環境提供的+、-、*、/、%基本算術運算,對各位數字做相應的運算,就可對整數的加、減、乘、除、求余數運算進行改進。
4.1加減法運算的改進
以計算機組成原理中二進制數全加器設計原理為基礎[2],可對整數加法進行擴充。因整數中的各位數字分別存放在相應的下標變量中,各位相加時,用一個變量記錄向上進位的數字,上一位相加時,要加上向上進位的數字,其實就是用數組元素模擬傳統的豎式計算兩個整數的加法。
加法運算改進程序段:

有了加法運算的程序,在此基礎上很容易擴充減法運算,只是在對應的位上數字不夠減時,要考慮向高一位借位。如高一位是零時,還需向該位的高一位借位,直到借到不是零的高位,這樣一位一位地減,最后完成兩個數的減法運算,與加法運算一樣,也是用數組元素模擬傳統的豎式來計算減法。
加法和減法運算改進后,為乘法的運算的改進打下了基礎,由于篇幅有限具體的方法和實現運算的程序這里不再贅敘。
4.2求除法、余數運算方法的改進
求除法、余數運算的方法比較特殊,以求余數為例,是從被除數的高位起來求余數。如求4147被3除的余數,從最高位開始,4被3除余1,然后借位給低位,下一位是1,加上高一位的借位就是1× 10+1=11,11被3除余數是2,繼續借位給下一位4,加上高一位的借位就是2×10+4=24,24被3除余數是0,繼續借位給下一位7,加上高一位的借位就是0×10+7=7,7被3除余數是1,因為7是最后一位,沒有借位了,最后的余數1就是4147被3除的余數。以上求余數的過程,通過編程,完全可以實現。
求余數運算改進程序段:


上述求余數的計算過程中,如果把每一步求余數時所得的商按從高位到低位存入一個整型數組中保存起來,就可得到兩個整數相除所得的商,實現除法運算,一舉兩得。
程序是計算機的靈魂,雖然程序設計語言環境提供的一些內容是受限制的,但程序設計方法是靈活和多樣的。只要善于應用程序設計語言下的各種數據表示形式,再與相應的算法相結合,就能編寫出解決實際問題的程序,使得在程序設計下類似于加1與減1的計算結果變得不再那么神秘和不可思議。
[1]顏盟盟.Visual C++從入門到精通.[M].第1版.北京:化學工業出版社,2009-08.21-22.
[2]袁春風.計算機組成與系統結構.[M].第1版.北京:清華大學出版社,2010-04.37-36,78-79.
[3]田淑清.全計算機等級考試二級教程—C語言程序設計[M].第1版.北京:高等教育出版社,2013-05.68-69,141-143.
(責任編輯張劍妹)
TP391
A
1673-2014(2016)02-0064-03
2015—11—07
郭建軍(1957—),男,山西長治人,副教授,主要從事計算機應用開發研究。