В C ++ 11 добавлены новые функции преобразования строк:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Он включает в себя stoi (строка в int), stol (строка в long), stoll (строка в long long), stoul (строка в long без знака), stoull (строка в long без знака). Примечательна его отсутствием функция stou (преобразование строки в беззнаковый). Есть ли причина, по которой он не нужен, а все остальные нужны?
связанные: В C ++ 11 нет функций "sto {short, unsigned short}"?
unsigned long
просто нетunsigned int
.unsigned long
это 64 бита иunsigned int
32. Они бывают разных типов, и нельзя предполагать, что они идентичны друг другу.stou
", а вопрос, в котором задается, возможно, определенная причина этой очевидной несогласованности. Если вы знаете, что такой причины нет, то опубликуйте ее как ответ.Ответы:
Наиболее удачным ответом было бы то, что в библиотеке C нет соответствующего символа «
strtou
», а строковые функции C ++ 11 - это просто тонко завуалированные оболочки вокруг функций библиотеки C:std::sto*
функции отражаютstrto*
и используютstd::to_string
функцииsprintf
.Изменить: как указывает Кенни TM,
stoi
иstol
используютсяstrtol
в качестве базовой функции преобразования, но все еще остается загадкой, почему, хотя существует,stoul
что используетstrtoul
, нет соответствующегоstou
.источник
boost::lexical_cast<>()
кажется более подходящим для C ++.sto*
, C ++ 11 21.5 / 1: Эффекты: первые две функции вызывают strtol (str.c_str (), ptr, base), а последние три функции вызывают strtoul (str.c_str (), ptr, base ), strtoll (str.c_str (), ptr, base) и strtoull (str.c_str (), ptr, base) соответственно.std::sto*
должен быть реализован как оболочка для функций библиотеки C, и действительная программа не может сказать, что они не были тайно реализованы иначе, реализация действительна.Понятия не имею, почему
stoi
существует, но нетstou
, но единственная разница междуstoul
гипотетическим и гипотетическимstou
- это проверка того, что результат находится в диапазонеunsigned
:(Точно так
stoi
жеstol
, только с другой проверкой диапазона; но поскольку он уже существует, нет необходимости беспокоиться о том, как именно его реализовать.)источник
stoi
иstol
, илиstol
иstoll
также является лишь проверкой диапазона.stoi
иstol
, да. Ноstol
иstoll
не отличаются только проверкой диапазона, они вызывают разные библиотечные функции.Использование масок для этого с ожидаемым размером значения в битах, выраженным в маске, сделает эту работу для 64-битных длинных и 32-битных целых чисел, но также и для 32-битных длинных и 32-битных целых чисел.
В случае 64-битных длинных значений ~ 0xffffffffl станет 0xffffffff00000000 и, таким образом, будет видеть, установлен ли какой-либо из верхних 32 бита. С 32-битными длинными значениями ~ 0xffffffffl становится 0x00000000, и проверка маски всегда будет нулевой.
источник