strtoull с базой 36, переполненной unsigned long long в Linux 32bit

0

Кто-нибудь знает, почему использование strtoull будет слишком длинным без знака? Значение "x" равно 12, когда я делаю вызов, поэтому я пытаюсь преобразовать 12-разрядную базу 36 num в unsigned long long.

Это должно работать правильно? Не имеет значения, скомпилирую ли я 32 или 64 бит. Я использую g++ на redhat.

buffer - char *

char *strPtr = buffer + ORDERIDOFFSET;
char *endPtr = strPtr + ORDERIDLENGTH;
long x = long((endPtr)) - long(buffer + ORDERIDOFFSET);
unsigned long long orderid = strtoull((buffer + ORDERIDOFFSET), &(endPtr), 36);

Благодарю!

Теги:
integer

2 ответа

4
Лучший ответ

Кажется, вы endptr том, что endptr является входным параметром strtoull, который сообщает ему, сколько времени занимает строка ввода. Это не. Это выходной параметр, который strtoull использует, чтобы сообщить вам первый символ, который он не смог преобразовать.

Я полагаю, что ваш буфер не завершен nul; вероятно, есть алфавитно-цифровой символ, следующий за вашим 12-значным номером базы-36.

Кстати, imho, x будет лучше вычисляться как endPtr - strPtr. Кастинг до long не совсем правильный.

1

Кажется, вы пытаетесь использовать endPtr в качестве входного параметра. std::strtoull принимает второй параметр в качестве выходного параметра.

Вы можете найти более надежным использование std::stoull вместо std::strtoull:

char *strPtr = buffer + ORDERIDOFFSET;
char *endPtr = strPtr + ORDERIDLENGTH; // assuming ORDERIDLENGTH takes you 1 passed the end of the actual ID string
std::string s(strPtr, endPtr);
unsigned long long orderid = std::stoull(s, nullptr, 36);

Дополнительно,

long x = long((endPtr)) - long(buffer + ORDERIDOFFSET);

не переносится в 64-битные системы (вы усекаете адрес). Я уверен, что вы хотите

std::size_t x = endPtr - strPtr;
  • 0
    @ chux Хороший вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню