【问题标题】:to get value from String variable containing a decimal number representing a value of about 64 gigabyte从包含代表约 64 GB 值的十进制数的字符串变量中获取值
【发布时间】:2013-11-21 00:45:06
【问题描述】:

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

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

我正在 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 值?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢。 C++ Builder XE4 支持 strtoll 函数。所以我会使用strtoll。我也将大小的类型更改为 long long。然后它起作用了。我很感激。
    • 也感谢您纠正我的英语。我改变了这个问题的标题。我希望这种变化会减少混乱。
    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢。 __int64 比“long long”更简单,使代码更清晰。另外,我同意不使用 double 除非我有理由这样做。
    【解决方案3】:

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

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

    【讨论】:

    • 非常感谢。我不知道 size_t 是 32 位无符号类型。我将使用 long long 类型。所以,使用 ToDouble() 然后 static_cast 到 long long 可能有效,对吧?
    • 不需要演员表。
    • @sevenOfNine:size_t 的大小可能是 32 位或 64 位,具体取决于系统。 (其他尺寸是允许的,但这些是最常见的。)
    • 在 XE4 中,StringUnicodeString 的别名,而不是 AnsiString,自 C++Builder 2009 以来一直如此。
    • @Keith Thompson:感谢您的评论。我会在不同的系统上检查 size_t。
    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多