从String变量中获取值,该变量包含表示值大约64千兆字节的十进制数

时间:2013-11-21 00:45:06

标签: c++ string c++builder c++builder-xe4

我有一个将String转换为值的问题。

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

我在C ++ Builder 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不起作用,因为long类型高达4.3GB。

C ++ Builder XE4中是否有任何功能,当我处理64GB或几百GB(例如500GB)时,我可以将strSize转换为size_t值?

3 个答案:

答案 0 :(得分:2)

你没有一个64GB的字符串,这个字符串的大小是64千兆字节。您有一个包含十进制数字的字符串,表示值约为64 gig。

您要查找的标准函数是strtoll,它会返回long long个结果。自1999年标准以来,它一直是标准的C函数,如果我没错,那么从2011年开始就被添加到C ++标准中。

(问题是C ++ Builder XE4是否支持strtoll。)

如果系统上的size_t仅为32位,则无法获得大size_t的值。如果它是64位,strtoll应该可以做到这一点。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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