2014-12-02 795 views
12

我正在做兩個涉及atoi的操作,我在想如何使用無符號整數來做到這一點,因爲atoi似乎將它們轉換爲signed,導致環繞整數溢出。我想使用32位無符號整數,但atoi將我有效地限制爲31位無符號整數。atoi無符號整數的等效

if (multiplication_is_safe(atoi(argv[1]),atoi(argv[3]))) 
    { 
    printf("%s * %s = %u \n", argv[1], argv[3], atoi(argv[1]) * atoi(argv[3])); 
     return 0; 
    } else 
+0

'atoll'?我不確定它是否是一個標準的C函數。 – mukunda 2014-12-02 22:36:07

+0

如果代碼至少需要16位無符號數,則使用'unsigned'。如果代碼至少需要32位無符號數,則使用'unsigned long'。如果代碼需要精確到32位,則使用'uint32_t'。 – chux 2014-12-03 18:35:37

回答

14

簡單的答案是使用strtoul()代替。

較長的答案是,即使你所需要的所有簽署32個整數或樂於接受未簽名的31位中,atoi()功能是一個貧窮的適合你看起來是在做。

正如您已經注意到的,atoi()函數將字符串轉換爲整數。一個正常的有符號整數。但是,atoi()不是做的是錯誤處理。什麼atoi()的規範說是‘如果該值不能表示,該行爲是不確定的。

的strto *()函數家族都明確規定如何處理錯誤,所以你應該在所有的情況下更換atoi()調用strtol()(將字符串轉換爲long),在這種情況下,因爲您要處理無符號整數,所以應該使用strtoul()(將字符串轉換爲無符號長整數)。

另請注意,如果要處理較大的數字,則有strtoll()strtoull()函數可將字符串轉換爲long long或unsigned long long。 (如果你只是想處理的最大可能的整數值,同時在兩者之間,有strtoimax()strtoumax()intmax_t類型或uintmax_t的是返回值分別與所有的東西困擾。)

POSIX文件:

2

根據您的平臺,strtoul可能是你想要什麼:

的strtoul將()函數根據給定的NPTR 字符串的最初部分轉換爲unsigned long int值的基礎上,其必須 是包容性的2和36之間,或者是特殊值0