从包含表示约 64 GB 值的十进制数的 String 变量中获取值



我有一个将字符串转换为值的问题。

以下是我尝试的示例代码。

我正在C++生成器XE4上尝试这个。

String strSize = L"64420392960"; // 64GB
size_t size;
size = strSize.ToDouble(); // returns 4290850816
char *end_ptr;
size = strtol(AnsiString(strSize).c_str(), &end_ptr, 10); // returns 0

ToDouble(( 和 strtol(( 都不起作用。

我知道 strtol 不起作用,因为长字体高达 4.3GB。

C++生成器 XE4 中是否有任何函数,当我处理 64GB 或数百 GB(例如 500GB(时,我可以使用它将 strSize 转换为size_t值?

您没有 64GB 的字符串,该字符串的大小为 64 GB。您有一个字符串,其中包含一个十进制数,表示大约 64 gig 的值。

您要查找的标准函数是 strtoll ,它返回long long结果。自 1999 年标准以来,它一直是标准的 C 函数,如果我没记错的话,它于 2011 年被添加到 C++ 标准中。

(问题是C++生成器XE4是否支持strtoll

如果系统上的size_t只有 32 位,则无法获得这么大的size_t值。如果是 64 位,strtoll应该可以解决问题。

其他人已经解释了为什么你的原始代码不起作用。 还有另一种选择:使用 __int64 而不是 long long . VCL支持__int64,例如:

String strSize = L"64420392960";
__int64 size = StrToInt64(strSize);

除非确实需要浮点精度,否则不要使用 double

问题是 VCL String对象(显然是 VCL AnsiString UnicodeString类的别名(返回值为 64420392960.0 的double,该值被转换为整数类型,但size_t是 32 位无符号类型,因此它只保留值的较低 32 位。

如果您的工具链支持size_t请尝试unsigned long long或普通旧long long,而不是类型。

最新更新