получить значение из строковой переменной, содержащей десятичное число, представляющее значение около 64 гигабайт

У меня есть вопрос в преобразовании строки в значение.

Ниже приведен пример кода, который я пробовал.

Я пытаюсь это на 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, с помощью которой я могу преобразовать strSize в значение size_t, когда я обрабатываю 64 ГБ или несколько сотен ГБ (например, 500 ГБ)?

0

Решение

У вас нет строки размером 64 ГБ, то есть строки размером 64 гигабайта. У вас есть строка, содержащая десятичное число, представляющее значение около 64 гигабайт.

Стандартная функция, которую вы ищете strtoll, который возвращает long long результат. Это стандартная функция C со стандарта 1999 года, и, если я не ошибаюсь, она была добавлена ​​в стандарт C ++ с 2011 года.

(Вопрос в том, поддерживает ли C ++ Builder XE4 strtoll.)

Если size_t в вашей системе только 32 бита, нет способа получить size_t ценность такая большая. Если это 64 бита, strtoll должен сделать свое дело.

2

Другие решения

Другие люди объяснили, почему ваш оригинальный код не работает. Есть еще одна альтернатива: использовать __int64 вместо long long, VCL имеет поддержку __int64Например:

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

Не использовать double если вам действительно не нужна точность с плавающей точкой.

1

Проблема в том, что VCL String объект (который, очевидно, псевдоним для VCL AnsiString UnicodeString класс) возвращает double со значением 64420392960.0, которое преобразуется в целочисленный тип, но size_t является 32-битным типом без знака, поэтому он сохраняет только младшие 32 бита значения.

Вместо типа size_t попробуй unsigned long long или старый long long если ваш набор инструментов поддерживает это.

1