根据以下规范strtol
:
如果主题序列具有预期的形式并且 base 的值为 0,则从第一个数字开始的字符序列应解释为整数常量。如果主题序列具有预期的形式,并且碱基的值在 2 到 36 之间,则应将其用作转换的碱基,并为每个字母赋予其值,如上所示。如果主题序列以减号开头,则转换产生的值应取反。指向最终字符串的指针应存储在 endptr 指向的对象中,前提是 endptr 不是空指针。
手头的问题是,在否定之前,该值不在 的范围内long
。例如,在 C89 中(整数常量不能采用 type long long
),写入-2147483648
可能是溢出;你必须写(-2147483647-1)
或类似的。
由于使用“整数常量”的措辞可以解释为将 C 规则应用于整数常量的类型,这可能足以使我们免于此处未定义的行为,但同样的问题(没有这么简单的问题)将适用于strtoll
.
编辑:最后,请注意,即使它确实溢出,也应该返回“正确”值。所以这个问题实际上只是关于errno
在这种情况下是否可以或必须设置。