簡體   English   中英

負數的strtoul

[英]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獲取文檔,它似乎更准確:

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

如上所述,可選的加號或減號是有效的符號

根據POSIX標准

0{ULONG_MAX}{ULLONG_MAX}在出錯時返回並且在成功時也是有效返回,希望檢查錯誤情況的應用程序應將errno0 ,然后調用strtoul()strtoull() ,然后檢查errno

你需要檢查errno

來自不同的參考:cppreference.com:

返回值

成功時str的內容對應的整數值。 如果轉換后的值超出相應返回類型的范圍,則會發生范圍錯誤並返回ULONG_MAX或ULLONG_MAX。 如果不能執行轉換,則返回0。

這顯然與cplusplus.com不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM