C++ 为什么有时候人们更喜欢strtoll而不是strtol,即使他们只想将字符串转换为int32?

C++ 为什么有时候人们更喜欢strtoll而不是strtol,即使他们只想将字符串转换为int32?,c++,gflags,C++,Gflags,下面是我从谷歌的gflags源代码中读到的代码片段 case FV_INT32: { const int64 r = strto64(value, &end, base); if (errno || end != value + strlen(value)) return false; // bad parse if (static_cast<int32>(r) != r) // worked, but number out of range ret

下面是我从谷歌的gflags源代码中读到的代码片段

case FV_INT32: {
  const int64 r = strto64(value, &end, base);
  if (errno || end != value + strlen(value))  return false;  // bad parse
  if (static_cast<int32>(r) != r)  // worked, but number out of range
    return false;
  SET_VALUE_AS(int32, static_cast<int32>(r));
  return true;
}
显然,作者更喜欢strtoll而不是strtol。根据这两个功能的手册页, 一个返回long-long-int,另一个返回long-int。如果您只需要一个int32,它们都可以,对吗


那么这两个函数之间有什么区别呢?为什么选择strtoll

您的问题实际上是:“当标志为
FV_INT32
时,这里为什么使用
strot64
?”:

由于此检查,此代码似乎更喜欢
strot64

if (static_cast<int32>(r) != r)
if(静态施法(r)!=r)
因此,它首先尝试尽可能多地吞下这个数字,因此
strot64
。之后,它可以轻松地检查它是否适合32位



关于
strtoll
long
保证至少64位宽。因此,在支持长整型int的系统上,对于strot64,它至少是一个64位整数,这是有意义的。另一方面,
long int
的保证是它至少是一个32位整数。在某些系统/使用某些编译器时,
long int
是64位整数。在其他情况下,它只有32位。Google header希望在不提供
strtoll
strtoq
的系统上,
long int
实际上是64位的,因为否则无法将字符串转换为
long int

它被广泛使用。如果我们使用一个32位的整数,那么当我们试图存储一个手机号码时,我们已经超出了范围,如果我们使用long-long-int,那么范围超过了之前的范围,这样我们就可以存储更多的号码。但是你只想要一个int32,对吗?你可以吞下一个长整型,但最后你会将它转换成一个整型32。如果该数字大于int32,它仍然返回false。所以长整型似乎就足够了。@coinsyx a
long int
不能保证为64位,就像a
long
一样。
if (static_cast<int32>(r) != r)