[英]strtoul of negative number
下面的C ++程序調用負數為1的strtoul
。由於在任何無符號類型中都沒有可表示負數,我原以為這會失敗並返回0
但是返回一個大的正數
如果讀取的值超出unsigned long int的可表示值范圍,則函數返回
ULONG_MAX
(在<climits>
定義),並且errno
設置為ERANGE
。
#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?
您最好使用cppreference.com獲取文檔,它似乎更准確:
如果減號是輸入序列的一部分,則從數字序列計算的數值將被否定,就像結果類型中的一元減號一樣,它應用無符號整數環繞規則。
如上所述,可選的加號或減號是有效的符號
從
0
,{ULONG_MAX}
和{ULLONG_MAX}
在出錯時返回並且在成功時也是有效返回,希望檢查錯誤情況的應用程序應將errno
為0
,然后調用strtoul()
或strtoull()
,然后檢查errno
。
你需要檢查errno
。
來自不同的參考:cppreference.com:
返回值
成功時str的內容對應的整數值。 如果轉換后的值超出相應返回類型的范圍,則會發生范圍錯誤並返回ULONG_MAX或ULLONG_MAX。 如果不能執行轉換,則返回0。
這顯然與cplusplus.com不同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.