0

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

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

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

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

4

3 回答 3

2

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

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

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

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

于 2013-11-21T00:53:47.533 回答
1

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

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

double除非你真的需要浮点精度,否则不要使用。

于 2013-11-21T01:19:43.250 回答
1

问题是 VCLString对象(显然是 VCL类的别名)返回 a ,其值为 64420392960.0 ,它被转换为整数类型,但它是 32 位无符号类型,因此它只保留低 32 位价值。AnsiString UnicodeStringdoublesize_t

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

于 2013-11-21T00:53:24.990 回答