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

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

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

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

17.03.2014, 05:23. Просмотров 1511. Ответов 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
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:39  [ТС] #16
да. хотя честно не совсем понимаю какая разница где оно находится...
0
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,472
Записей в блоге: 2
17.03.2014, 11:44 #17

Не по теме:

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

Сформулируйте задачу точнее.
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:48  [ТС] #18
char* = "число"
необходимо конвертнуть
char* в dword
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.03.2014, 12:07 #19
Цитата Сообщение от ValeryS Посмотреть сообщение
long long, хотя говорят он не стандартный
начиная с C++11 уже стандартный.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
Т.к. dword это синоним (typedef) какого-то стандартного типа, можно выяснить через std::numetic_limits его предельные значения, и дальше разбирать посимвольно строку дабы диагностировать факт выхода из границ.
Хотя можно и стандартную strtol натравить, которая должна установить errno в ERANGE в случае выхода из диапазона.
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 14:00 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя можно и стандартную strtol натравить, которая должна установить errno в ERANGE в случае выхода из диапазона.
По-моему, самое правильное, в данном случе (если понял, что, собственно, нужно).

DarkMasterW, как вот это:
Цитата Сообщение от DarkMasterW Посмотреть сообщение
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
совмещается вот с этим?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить?
(это ответ на то, что если, при преобразовании char* в число, через функции типа atoi, получится число больше предельно допустимого, то оно будет автоматически обрезано до максимально допустимого).
Не допустить и допустить, но выдать ошибку - это совершенно разные задачи.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.03.2014, 14:05 #21
Цитата Сообщение от alsav22 Посмотреть сообщение
через функции типа atoi, получится число больше предельно допустимого, то оно будет автоматически обрезано до максимально допустимого
Судя по описанию atoi, при выходе за пределы будет UB:
If the converted value would be out of the range of representable values by an int, it causes undefined behavior.
Поэтому, всё же лучше использовать strtol.
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 14:53 #22
Цитата Сообщение от Tulosba Посмотреть сообщение
Поэтому, всё же лучше использовать strtol.
Если строковый поток?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.03.2014, 15:10 #23
Цитата Сообщение от alsav22 Посмотреть сообщение
Если строковый поток?
Не понял вопроса.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 15:20 #24
Цитата Сообщение от Tulosba Посмотреть сообщение
Не понял вопроса.
Строковый поток корректно обрабатывает такие ситуации? Если получается число больше предельно допустимого для типа переменной?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.03.2014, 16:46 #25
Цитата Сообщение от alsav22 Посмотреть сообщение
Строковый поток корректно обрабатывает такие ситуации?
Тут не строковый поток надо смотреть, а operator>>(int&) и т.п. для std::istream. На тесте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
     
int main() {
     
    int i;
    std::cin >> i;
     
    std::cout << i << std::endl;
    std::cout << std::boolalpha << std::cin.fail() << std::endl;
     
    return 0;
}
http://ideone.com/GkDNy2
видно, что при переполнении fail() возвращает true.
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 17:55 #26
Цитата Сообщение от Tulosba Посмотреть сообщение
видно, что при переполнении fail() возвращает true.
При этом, значение переменной станет равно...?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.03.2014, 18:13 #27
Цитата Сообщение от alsav22 Посмотреть сообщение
При этом, значение переменной станет равно...?
По ссылке видно
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 18:30 #28
Цитата Сообщение от Tulosba Посмотреть сообщение
По ссылке видно
У меня такое выводит: -858993460. Стандарт что-нибудь по этому поводу говорит?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.03.2014, 12:30 #29
Цитата Сообщение от alsav22 Посмотреть сообщение
Стандарт что-нибудь по этому поводу говорит?
22.4.2.1.2/3 Stage 3:
The numeric value to be stored can be one of:
— zero, if the conversion function fails to convert the entire field. ios_base::failbit is assigned to err.
— the most positive representable value, if the field represents a value too large positive to be represented in val. ios_base::failbit is assigned to err.
— the most negative representable value or zero for an unsigned integer type, if the field represents a value too large negative to be represented in val. ios_base::failbit is assigned to err.
— the converted value, otherwise.
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня такое выводит: -858993460.
Это скорее всего просто не инициализированное значение переменной. У меня 2010 студия например так же себя ведет. Т.е. получается, что не по стандарту. Хотя цитата ведь из C++11, а в C++03 могло быть другое поведение, хотя бы потому, что тогда не было strtoll().
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2014, 12:47 #30
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. получается, что не по стандарту.
Получается, что и atoi(), в студии, себя не по стандарту ведёт: вместо UB, просто выдаёт максимально допустимое значение для типа (поэтому, в начале темы, и написал).
0
18.03.2014, 12:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 12:47
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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