strtoull(“ - 1”,NULL,0)在我测试的系统上评估为18446744073709551615,(0xFFFFFFFFFFFFFFFF又名ULLONG_MAX)(OS / X与Apple Libc,Linux与Glibc)。
因为strtoull应该检查……
C部分标准的普遍解释(C99第7.20.1.4节,C11第7.22.1.4节,两者第5段)是转换是在第一步中进行,忽略减号,产生无符号结果。然后否定该结果。这是建议的
如果主题序列以减号开头,则转换产生的值将被否定(在返回类型中)。
在标准文本中。 无符号类型的否定值是明确定义的 ,因此如果第一步产生可表示的值,则整体结果是可表示的。由于否定,没有后续错误。
另一方面,如果输入字符串包含的数字太大而无法表示为 unsigned long long int 值,转换的第一步不能产生可表示的值,第8段适用:
unsigned long long int
如果正确的值超出可表示值的范围,[锟拷] ULLONG_MAX 返回[和],以及宏的值 ERANGE 存储在 errno 。
ULLONG_MAX
ERANGE
errno
同样,几乎所有实现者都以这样的方式解释标准,即可表示的值检查仅适用于第一个转换步骤,从输入字符串中的任意精度非负整数到无符号类型。