atoi函式不同平台的實現問題

2021-08-25 00:24:00 字數 974 閱讀 5840

atoi函式不同平台的實現問題

工程中要通過檔案得到數值,想當然的就使用了atoi這個函式。在

windows下使用,沒什麼問題。但是一移植到linux下,問題就出來了,

發現得到的數總是不對勁。用gdb跟蹤一下,發現大於2147483647的數

均返回2147483647這個值。又在windows下debug了一下,發現得到的數

值正常,能夠得到大於2147483647的數。

這就比較有趣了,2147483647十六進製制表示是0x7fffffff。應該是

越界問題。查了一些資料,發現gcc在實現atoi函式的時候,如果輸入

的字串數值大於int型最大值將返回int_max(2147483647)這個值。

又在windows下,使用vs.net2003測試了一下,發現數值在2^31~

2^32-1之間,返回正常的數,而大於2^32-1將返回模2^32的數。

vs.net2003內部實現atoi函式使用了取模操作,以2^32為模。而

gcc使用了截斷操作,以2^31-1為界,超過同一返回2^31-1。

因此,使用atoi函式就需要小心些。而且atol函式跟atoi函式一

樣,測試結果一樣。

為了支援得到超過2^31-1的數,在linux下就必須使用strtoul這

個函式。

unsigned long strtoul(

const char *nptr,

char **endptr,

int base

);這個函式功能比atoi強大的多,第乙個引數是需要轉換的字串,

第二個引數是掃瞄結束時指向的位置,從而可以用來獲知有沒有轉換

溢位,第三個引數是進製,支援2~64之間任意乙個。這樣就可以知道

轉換了多少個字元。

ps:又用vs.net2005測試過,發現atoi返回的結果已經跟linux一致了,

即大於int_max時,返回int_max。

atoi函式的實現

atoi函式的實現 寫這個函式的實現的原因很簡單,而且也很容易,直接抄襲的庫中的原始碼。因為有朋友面試的時候遇到了,前幾天乙個哥們面intel的時候也被問到了,巧合的是今天看廣聯達的面試題再次遇到。一周之內看到三次,讓我不得不重視一下啊,畢竟自己也要開始面試題呀面試題了!其實這個函式比較容易實現,不...

atoi函式的實現

atoi函式的實現 寫atoi函式的時候需要注意一下幾點 1.字串前的空白 2.字串所表示數值的正負號 3.結束條件,遇到非數字或者字元 0 結束 4.考慮溢位,分別與int值所能表示的最大 0x7fffffff 和最小值 0x8000000 進行比較 5.考慮異常輸入情況下,用全域性變數valid...

atoi 函式的實現

atoi 函式的功能 將字串轉換成整型數 atoi 會掃瞄引數nptr字串,跳過前面的空格字元,直到遇上數字或正負號才開始做轉換,而再遇到非數字或字串時 0 才結束轉化,並將結果返回 返回轉換後的整型數 atoi 函式實現的 name xif coder xifan 2010 yahoo.cn ti...