我有一个将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值?
答案 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
。