Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
#1

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

17.03.2014, 05:23. Просмотров 1568. Ответов 37
Метки нет (Все метки)

Собственно есть char*, надо в int. Вроде есть atoi для этих целей. Но тут появляется пара неудобных вопросов:
1) Что если число будет слишком большим и не поместиться в инт?
2) Скорее теоретически, т.к. не цифры отсекаются при формировании входного char*, но тем не менее: что если в char* будут не только цифры?

Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 05:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что если число будет слишком большим и не поместиться в int? (C++):

Если первое число окажется кратным 5 или второе число будет нечетным, то вывести на экран сумму их модулей - C++
4. Даны два числа N и М. Если первое число окажется кратным 5 или второе число будет нечетным, то вывести на экран сумму модулей заданных...

Как в выделенную память записать поочередно число int, массив char[n], и еще число int - C++
Выделяю память void* Start=malloc(Size); Как туда записать поочередно число int, массив char, и еще число int?

Что будет если так сделать? - C++
Всем привет! Что будет если применить такую конструкцию int global; void Test(const int& a) { global = a; } То...

Как получить число типа int, если имеется указатель на строку с этим числом? - C++
допустим у меня есть строка " 45"; и указатель на нее string *str; как получить из нее число 45 в виде int?

Работа со стеком. Если массив нужен float, а не int, что необходимо изменить - C++
#include <iostream> #include <stdlib.h> using namespace std; // ****************СТЕК НА ОСНОВЕ МАССИВА*************** const int N =...

Что будет, если new вызвать 2 раза с одним и тем же указателем? - C++
Собственно вопрос что будет? напрмер int *i=new(1); i=new(3); i будет сылаться на ячеку со значенеим 3 это ясно, а куда денется ячейка со...

37
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 05:51 #2
Ответы на поставленные вопросы:
Цитата Сообщение от DarkMasterW Посмотреть сообщение
1) Что если число будет слишком большим и не поместиться в инт?
Будет обрезано до максимально допустимого.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
не цифры отсекаются при формировании входного char*
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 06:34  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Будет обрезано до максимально допустимого.
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:40 #4
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить?
Как придумаете. Вариантов много.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Обрезать по количеству символов, загнать в long, потом в int?
Можно так, можно по-другому. Сами на свои вопросы отвечаете. Если хотите спросить: как лучше сделать, то без понятия, всё зависит от задач, условий и пр.
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 07:06  [ТС] #5
Спрашиваю потому, что не уверен в решении. Опыта ноль...
Суть задачи: в длл прилетает char*, в нем есть некоторый набор параметров для расчетов. Соответственно параметры надо перегнать в числовой тип. Надо сделать защиту от дурака. Контроль со стороны программы посылающей данные в длл невозможен.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 08:02 #6
Цитата Сообщение от DarkMasterW Посмотреть сообщение
в нем есть некоторый набор параметров для расчетов
Как выглядит этот набор? Что из себя представляет (или может представлять)? Как распологается в строке (или это слово?)?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Соответственно параметры надо перегнать в числовой тип.
Какого типа?
0
Donnerwetter
40 / 40 / 12
Регистрация: 04.02.2014
Сообщений: 144
17.03.2014, 08:10 #7
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
Если заранее известно, что переменная не будет принимать отрицательных значений, можно сразу исключить диапазон чисел меньше 0. Допустим, таким образом: unsigned long long. Такая запись увеличит ячейку памяти до 64 бит и поместится число 264-1.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
17.03.2014, 08:29 #8
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Собственно есть char*, надо в int. Вроде есть atoi для этих целей.
тогда есть atol или atof
http://devoid.com.ua/functions-about/c-functions/atof-atol.html
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Функция прекращает чтение исходной строки как только появится первый символ,
от туда же
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 09:01  [ТС] #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 соответственно.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 10:14 #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]
Для ясности, конкретные примеры строк привидите, и укажите, что из каждой нужно извлечь.
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 10:34  [ТС] #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, дальше уже математикой проверяем и срезаем. Т.е. та же схема, о которой думал изначально.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 10:58 #12
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Оно все извлекается
Оно это что?
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
17.03.2014, 11:19 #13
Цитата Сообщение от DarkMasterW Посмотреть сообщение
считал dword именно unsigned int,
DWORD это двойное слово 4 байта

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

для 64 битных компиляторов, размерности не знаю
1
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:31  [ТС] #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Оно это что?
вся строка исправно парсится в свои переменные. Вопрос только по безопасности парсинга dword'у по сути.
Цитата Сообщение от ValeryS Посмотреть сообщение
для 32 битных это int
во многих 32 битных компиляторах long=int=4
Видимо поэтому так и считал. Как раз времена были когда про 16 уже совсем забыли, а о 64 еще не думали.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 11:34 #15
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Вопрос только по безопасности парсинга dword'у по сути.
Разговор о втором слове в строке? Это имеется ввиду под dword?
0
17.03.2014, 11:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 11:34
Привет! Вот еще темы с ответами:

Для чего используется _getch() и что будет, если ее не использовать? - C++
_getch(); 1)для чего это? 2)что будет,если написать без него? ..... cout << "периметр равен:" << " " << p << endl; ...

Intel Intrinsic. Что будет, если объявить много __m128 переменных? - C++
Использую функции для работы с xmm-регистрами. У меня на машине их 16, однако компилятор позволяет объявлять переменные типа __m128 сколь...

Зачем преобразовывать itsVal в int, если эта переменная и так объявлена как тип int - C++
// Оператор преобразования #include <iostream> using namespace std; class Counter { public: Counter(): itsVal(0) {} ...

Что будет, если два раза динамически выделить память по одному указателю? - C++
Например: int *mas = new int; mas = new int;


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.