Форум программистов, компьютерный форум CyberForum.ru

Что если число будет слишком большим и не поместиться в int? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 05:23     Что если число будет слишком большим и не поместиться в int? #1
Собственно есть char*, надо в int. Вроде есть atoi для этих целей. Но тут появляется пара неудобных вопросов:
1) Что если число будет слишком большим и не поместиться в инт?
2) Скорее теоретически, т.к. не цифры отсекаются при формировании входного char*, но тем не менее: что если в char* будут не только цифры?

Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 05:23     Что если число будет слишком большим и не поместиться в int?
Посмотрите здесь:

Что означает конструкция int(cls::*), если cls - это класс ? C++
Что будет если так сделать? C++
C++ Дано натуральное число N. Напишите функцию int NumberOfZeroes(int n) (C/C++/Java)
C++ Как в выделенную память записать поочередно число int, массив char[n], и еще число int
Для чего используется _getch() и что будет, если ее не использовать? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 05:51     Что если число будет слишком большим и не поместиться в int? #2
Ответы на поставленные вопросы:
Цитата Сообщение от DarkMasterW Посмотреть сообщение
1) Что если число будет слишком большим и не поместиться в инт?
Будет обрезано до максимально допустимого.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
не цифры отсекаются при формировании входного char*
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 06:34  [ТС]     Что если число будет слишком большим и не поместиться в int? #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Будет обрезано до максимально допустимого.
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:40     Что если число будет слишком большим и не поместиться в int? #4
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить?
Как придумаете. Вариантов много.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Обрезать по количеству символов, загнать в long, потом в int?
Можно так, можно по-другому. Сами на свои вопросы отвечаете. Если хотите спросить: как лучше сделать, то без понятия, всё зависит от задач, условий и пр.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 07:06  [ТС]     Что если число будет слишком большим и не поместиться в int? #5
Спрашиваю потому, что не уверен в решении. Опыта ноль...
Суть задачи: в длл прилетает char*, в нем есть некоторый набор параметров для расчетов. Соответственно параметры надо перегнать в числовой тип. Надо сделать защиту от дурака. Контроль со стороны программы посылающей данные в длл невозможен.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 08:02     Что если число будет слишком большим и не поместиться в int? #6
Цитата Сообщение от DarkMasterW Посмотреть сообщение
в нем есть некоторый набор параметров для расчетов
Как выглядит этот набор? Что из себя представляет (или может представлять)? Как распологается в строке (или это слово?)?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Соответственно параметры надо перегнать в числовой тип.
Какого типа?
Donnerwetter
40 / 40 / 12
Регистрация: 04.02.2014
Сообщений: 144
17.03.2014, 08:10     Что если число будет слишком большим и не поместиться в int? #7
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
Если заранее известно, что переменная не будет принимать отрицательных значений, можно сразу исключить диапазон чисел меньше 0. Допустим, таким образом: unsigned long long. Такая запись увеличит ячейку памяти до 64 бит и поместится число 264-1.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
17.03.2014, 08:29     Что если число будет слишком большим и не поместиться в int? #8
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Собственно есть char*, надо в int. Вроде есть atoi для этих целей.
тогда есть atol или atof
http://devoid.com.ua/functions-about...atof-atol.html
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Функция прекращает чтение исходной строки как только появится первый символ,
от туда же
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 09:01  [ТС]     Что если число будет слишком большим и не поместиться в int? #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Какого типа?
DWORD
Цитата Сообщение от alsav22 Посмотреть сообщение
Как выглядит этот набор? Что из себя представляет (или может представлять)? Как распологается в строке (или это слово?)?
[a-zA-Z0-9] [DWORD] [0-9] [0-9] [a-zA-Z0-9]
Примерно так. Может отсутствовать любое количество параметров начиная с конца, так же строка может иметь вид:
[a-zA-Z0-9] [a-zA-Z0-9]
Это корректный вид строки. Вся строка будет вбита ручками пользователем. Соответственно, что там прилетит никому не известно.
Начал читать подробнее про atoi - dword походу не его стезя. Или я ошибаюсь? Под unsigned нашел только strtoul, но он под long и strtoull под long long соответственно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 10:14     Что если число будет слишком большим и не поместиться в int? #10
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Под unsigned нашел только strtoul, но он под long
У меня DWORD и есть:
typedef unsigned long DWORD. А у вас?

Добавлено через 1 минуту
Цитата Сообщение от DarkMasterW Посмотреть сообщение
[a-zA-Z0-9] [DWORD] [0-9] [0-9] [a-zA-Z0-9]
Примерно так. Может отсутствовать любое количество параметров начиная с конца, так же строка может иметь вид:
[a-zA-Z0-9] [a-zA-Z0-9]
Для ясности, конкретные примеры строк привидите, и укажите, что из каждой нужно извлечь.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 10:34  [ТС]     Что если число будет слишком большим и не поместиться в int? #11
Цитата Сообщение от alsav22 Посмотреть сообщение
typedef unsigned long DWORD. А у вас?
К своему стыду много лет считал dword именно unsigned int, правда я и не писал... Честно говоря немного в шоке...
Цитата Сообщение от alsav22 Посмотреть сообщение
Для ясности, конкретные примеры строк привидите, и укажите, что из каждой нужно извлечь.
Оно все извлекается, так же есть все необходимые проверки кроме обсуждаемого значения. Примеры:
Sub9 268009 5 1 9 Point1
Sub9 268009
Sub9 Point1
VerL 12800 8 0 7 dis8toDis1
VerL 12800 8
Первое и последнее слово могут иметь численно-буквенное значение, символы в любом порядке могут идти.

Склоняюсь к strtoul и strtoull. Срезаем char* до такой длинны, чтобы точно влезло в long long и не влезло в long, дальше уже математикой проверяем и срезаем. Т.е. та же схема, о которой думал изначально.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 10:58     Что если число будет слишком большим и не поместиться в int? #12
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Оно все извлекается
Оно это что?
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
17.03.2014, 11:19     Что если число будет слишком большим и не поместиться в int? #13
Цитата Сообщение от DarkMasterW Посмотреть сообщение
считал dword именно unsigned int,
DWORD это двойное слово 4 байта

а вот как оно реализовано в конкретном компиляторе, вопрос
для 16 битных это был long
для 32 битных это int
во многих 32 битных компиляторах long=int=4
а для 64бит(8 байт) уже используют long long, хотя говорят он не стандартный

для 64 битных компиляторов, размерности не знаю
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 11:31  [ТС]     Что если число будет слишком большим и не поместиться в int? #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Оно это что?
вся строка исправно парсится в свои переменные. Вопрос только по безопасности парсинга dword'у по сути.
Цитата Сообщение от ValeryS Посмотреть сообщение
для 32 битных это int
во многих 32 битных компиляторах long=int=4
Видимо поэтому так и считал. Как раз времена были когда про 16 уже совсем забыли, а о 64 еще не думали.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 11:34     Что если число будет слишком большим и не поместиться в int? #15
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Вопрос только по безопасности парсинга dword'у по сути.
Разговор о втором слове в строке? Это имеется ввиду под dword?
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 11:39  [ТС]     Что если число будет слишком большим и не поместиться в int? #16
да. хотя честно не совсем понимаю какая разница где оно находится...
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,107
Записей в блоге: 3
17.03.2014, 11:44     Что если число будет слишком большим и не поместиться в int? #17

Не по теме:

Вторая страница, а воз на месте...

Сформулируйте задачу точнее.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
17.03.2014, 11:48  [ТС]     Что если число будет слишком большим и не поместиться в int? #18
char* = "число"
необходимо конвертнуть
char* в dword
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.03.2014, 12:07     Что если число будет слишком большим и не поместиться в int? #19
Цитата Сообщение от ValeryS Посмотреть сообщение
long long, хотя говорят он не стандартный
начиная с C++11 уже стандартный.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
Т.к. dword это синоним (typedef) какого-то стандартного типа, можно выяснить через std::numetic_limits его предельные значения, и дальше разбирать посимвольно строку дабы диагностировать факт выхода из границ.
Хотя можно и стандартную strtol натравить, которая должна установить errno в ERANGE в случае выхода из диапазона.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 14:00     Что если число будет слишком большим и не поместиться в int?
Еще ссылки по теме:

C++ Как получить число типа int, если имеется указатель на строку с этим числом?
C++ Зачем преобразовывать itsVal в int, если эта переменная и так объявлена как тип int
C++ Что будет, если два раза динамически выделить память по одному указателю?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 14:00     Что если число будет слишком большим и не поместиться в int? #20
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя можно и стандартную strtol натравить, которая должна установить errno в ERANGE в случае выхода из диапазона.
По-моему, самое правильное, в данном случе (если понял, что, собственно, нужно).

DarkMasterW, как вот это:
Цитата Сообщение от DarkMasterW Посмотреть сообщение
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
совмещается вот с этим?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить?
(это ответ на то, что если, при преобразовании char* в число, через функции типа atoi, получится число больше предельно допустимого, то оно будет автоматически обрезано до максимально допустимого).
Не допустить и допустить, но выдать ошибку - это совершенно разные задачи.
Yandex
Объявления
17.03.2014, 14:00     Что если число будет слишком большим и не поместиться в int?
Ответ Создать тему
Опции темы

Текущее время: 04:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru