2016-06-07 59 views
5

以下C++程序調用了負1的strtoul。由於在任何無符號類型中都沒有負數可表示,所以我期望這會失敗並返回0(If no valid conversion could be performed, a zero value is returned.),而是一個較大的正數返回(If the value read is out of the range of representable values by an unsigned long int, the function returns ULONG_MAX (defined in <climits>), and errno is set to ERANGE.)。負數的C/C++ strtoul

#include <cstdlib> 
#include <iostream> 

int main() { 
    {char s[] = "-1"; 
    for (int b=0; b<17; ++b) 
     std::cout << "strtoul (unsigned) of " << s 
       << " with base arg " << b 
       << ": " << strtoul(s,0,b) << std::endl;} 
} 

爲什麼strtoul不會失敗並返回0爲負數?

+1

什麼是你的操作系統明顯不同?編譯器? C/C++運行時? –

+0

@AndrewHenle。在這種情況下不相關。該功能表明正確的行爲。 –

+1

@Galik。不對。它只返回**無符號數字。 –

回答

2

您更好地使用cppreference.com爲documentation這似乎是更準確:

如果減號是輸入序列的一部分,從數字序列計算的數值 被否定的如果在結果類型中使用一元減號 ,該結果類型應用無符號整數環繞規則。

和作爲有可選的加號或減號提到是有效符號

+3

關於cplusplus.com文檔有什麼不準確? –

+0

至少它不像這個完整,這意味着它不準確 – Slava

+0

@ BenjaminLindley。他們拼寫出'++​​'而不是使用明顯更易理解的截斷。 –

2

Per the POSIX standard

由於0{ULONG_MAX}{ULLONG_MAX}的錯誤將被退回並 也成功有效的回報,希望應用程序來檢查 錯誤情況應該設置errno0,然後調用strtoul()strtoull(),然後檢查errno

您需要檢查errno

+0

errno至少爲RH 6.6和gcc 5.1.0 – Slava

+0

@Slava'-1'不會超出可表示值的範圍。 –

0

從不同的參考:cppreference.com:

返回值對應於所述內容

整數值成功的關鍵。如果 轉換後的值超出了相應返回類型的範圍,則會發生範圍 錯誤,並返回ULONG_MAX或ULLONG_MAX。如果不能執行轉換 ,則返回0。

這比cplusplus.com