的如下是由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