C++ 为什么有时候人们更喜欢strtoll而不是strtol,即使他们只想将字符串转换为int32?
下面是我从谷歌的gflags源代码中读到的代码片段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
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 along int
不能保证为64位,就像along
一样。
if (static_cast<int32>(r) != r)