的如下是由glibc的實現的功能strtoul
在stdlib.h
的描述:glibc中strtoul的實現是否與C11標準衝突?
功能:unsigned long int類型strtoul將(常量字符* retrict字符串,字符**限制tailptr,INT基) 初步:| MT-Safe locale | AS-Safe | AC-Safe |請參閱POSIX安全概念。
strtoul(「string-to-unsigned-long」)函數與strtol類似,只是它轉換爲無符號的long int值。語法與上面描述的strtol相同。溢出時返回的值爲ULONG_MAX(請參閱類型的範圍)。
如果字符串表示負數,strtoul與strtol的作用相同,但會將結果轉換爲無符號整數。這意味着例如「-1」上的strtoul返回ULONG_MAX並且輸入比LONG_MIN返回的負(ULONG_MAX + 1)/ 2更負。
如果base超出範圍,或者ERANGE溢出,strtoul會將errno設置爲EINVAL。
這意味着,例如,"-2"
將被轉換爲ULONG_MAX - 1
。但C11標準[7.22.1.4-8]表示:
的strtol將,與strtoll,strtoul將和strtoull將函數返回轉換 值,如果有的話。如果不能執行轉換,則返回零。 如果正確值超出可表示值的範圍,則返回LONG_MIN,LONG_MAX,LLONG_MIN,LLONG_MAX,ULONG_MAX或ULLONG_MAX(根據返回類型和值的符號,如果有的話),以及宏的值ERANGE存儲在errno中。
因此,按照標準,例如,"-2"
應轉換爲ULONG_MAX
。這是衝突嗎?
請注意,glibc跟C標準更接近[posix](http://pubs.opengroup.org/onlinepubs/9699919799/)。然而,C11 7.22.1.4.5似乎也處理了 - 符號,雖然我不清楚這種否定是否應該在引用7.22.1.4-8之前發生。 – nos
@nos,謝謝,但作爲我回復chux的時候,即使發生在溢出轉換之後,仍然存在衝突。 – xskxzr