У меня есть вопрос в преобразовании строки в значение.
Ниже приведен пример кода, который я пробовал.
Я пытаюсь это на 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 ГБ)?
У вас нет строки размером 64 ГБ, то есть строки размером 64 гигабайта. У вас есть строка, содержащая десятичное число, представляющее значение около 64 гигабайт.
Стандартная функция, которую вы ищете strtoll
, который возвращает long long
результат. Это стандартная функция C со стандарта 1999 года, и, если я не ошибаюсь, она была добавлена в стандарт C ++ с 2011 года.
(Вопрос в том, поддерживает ли C ++ Builder XE4 strtoll
.)
Если size_t
в вашей системе только 32 бита, нет способа получить size_t
ценность такая большая. Если это 64 бита, strtoll
должен сделать свое дело.
Другие люди объяснили, почему ваш оригинальный код не работает. Есть еще одна альтернатива: использовать __int64
вместо long long
, VCL имеет поддержку __int64
Например:
String strSize = L"64420392960";
__int64 size = StrToInt64(strSize);
Не использовать double
если вам действительно не нужна точность с плавающей точкой.
Проблема в том, что VCL String
объект (который, очевидно, псевдоним для VCL AnsiString
UnicodeString
класс) возвращает double
со значением 64420392960.0, которое преобразуется в целочисленный тип, но size_t
является 32-битным типом без знака, поэтому он сохраняет только младшие 32 бита значения.
Вместо типа size_t
попробуй unsigned long long
или старый long long
если ваш набор инструментов поддерживает это.