Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/56: Рейтинг темы: голосов - 56, средняя оценка - 4.61
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
1

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

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

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

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2014, 05:23
Ответы с готовыми решениями:

Что будет если к пустой строке применить strtoint. Какое число будет присвоено?
Что будет если к пустой строке применить strtoint. Какое число будет присвоено?

Что произойдет, если число будет больше максимального допустимого данным типом?
Что произойдет если число, присвоенное целой переменной с/без знаком(а), будет больше максимального...

Что будет выведено на экран в результате работы программы, если введено число 20?
7. Что будет выведено на экран в результате работы программы, если введено число 20? Через mod(m,...

Что будет, если установленная ОЗУ будет от разных производителей?
Добрый вечер! На мамке 2 слота для оперативки. купил недавно 2 гб OCZ. И сегодня 1гб другой фирмы....

37
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2014, 14:05 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 14:53 22
Цитата Сообщение от Tulosba Посмотреть сообщение
Поэтому, всё же лучше использовать strtol.
Если строковый поток?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2014, 15:10 23
Цитата Сообщение от alsav22 Посмотреть сообщение
Если строковый поток?
Не понял вопроса.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 15:20 24
Цитата Сообщение от Tulosba Посмотреть сообщение
Не понял вопроса.
Строковый поток корректно обрабатывает такие ситуации? Если получается число больше предельно допустимого для типа переменной?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 17:55 26
Цитата Сообщение от Tulosba Посмотреть сообщение
видно, что при переполнении fail() возвращает true.
При этом, значение переменной станет равно...?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2014, 18:13 27
Цитата Сообщение от alsav22 Посмотреть сообщение
При этом, значение переменной станет равно...?
По ссылке видно
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 18:30 28
Цитата Сообщение от Tulosba Посмотреть сообщение
По ссылке видно
У меня такое выводит: -858993460. Стандарт что-нибудь по этому поводу говорит?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2014, 12:47 30
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. получается, что не по стандарту.
Получается, что и atoi(), в студии, себя не по стандарту ведёт: вместо UB, просто выдаёт максимально допустимое значение для типа (поэтому, в начале темы, и написал).
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.03.2014, 13:04 31
Цитата Сообщение от alsav22 Посмотреть сообщение
вместо UB, просто выдаёт максимально допустимое значение для типа
Так UB на то и UB, что может быть и такой вариант

Добавлено через 7 минут
Посмотрел в С++03 22.2.2.1.2/11:
Stage 3:
The result of stage 2 processing can be one of
— A sequence of chars has been accumulated in stage 2 that is converted (according to the rules of scanf) to a value of the type of val. This value is stored in val and ios_base::goodbit is stored inerr.
— The sequence of chars accumulated in stage 2 would have caused scanf to report an input failure. ios_base::failbit is assigned to err.
Т.е. в случае ошибки про итоговое значение ничего не сказано. Следовательно, м.б. любым. И, кстати, про использование atoi() в этой цепочке ничего не сказано.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2014, 13:04 32
Цитата Сообщение от Tulosba Посмотреть сообщение
Так UB на то и UB, что может быть и такой вариант
В студии может быть какой-либо другой вариант? Если да, то как получить другой вариант? Если нет, то в чём тогда UB?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.03.2014, 13:20 33
Цитата Сообщение от alsav22 Посмотреть сообщение
В студии может быть какой-либо другой вариант?
2010 и 2012 студии ведут себя одинаково. При выходе из диапазона значение переменной не меняют (т.е. внутри они конечно возвращают LONG_MIN или LONG_MAX, но до пользователя оно не доходит), устанавливают errno = ERANGE;
Можете сами попробовать пройтись отладчиком.
Цитата Сообщение от alsav22 Посмотреть сообщение
Если нет, то в чём тогда UB?
Разговор про UB был относительно atoi(), если я ничего не путаю. А при чтении числа из потока (std::istream) atoi() не используется по факту. Есть фактически нечто похожее на требование C++11 (всякие _Stoulx() вместо std::strtoull()), но итоговое поведение не соответствует C++11.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2014, 13:33 34
Цитата Сообщение от Tulosba Посмотреть сообщение
Разговор про UB был относительно atoi(), если я ничего не путаю.
Я про неё и спрашиваю. В студии atoi(), при числе больше максимально допустимого, возвращает максимально допустимое.
Цитата Сообщение от Tulosba Посмотреть сообщение
Так UB на то и UB, что может быть и такой вариант
Цитата Сообщение от alsav22 Посмотреть сообщение
В студии может быть какой-либо другой вариант? Если да, то как получить другой вариант? Если нет, то в чём тогда UB?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.03.2014, 13:49 35
Цитата Сообщение от alsav22 Посмотреть сообщение
Я про неё и спрашиваю.
atoi() это сишная функции и описание следует смотреть в сишном стандарте уже. Вот в C99 такое есть:
7.20.1 Numeric conversion functions:
The functions atof, atoi, atol, and atoll need not affect the value of the integer expression errno on an error. If the value of the result cannot be represented, the behavior is undefined.
Если студия ведет себя более очевидным образом это ей только в плюс. Но не стоит надеяться, что другие реализации будут вести себя аналогично.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2014, 14:28 36
Цитата Сообщение от Tulosba Посмотреть сообщение
Если студия ведет себя более очевидным образом это ей только в плюс. Но не стоит надеяться, что другие реализации будут вести себя аналогично.
Я правильно понял, что в студии это не UB?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.03.2014, 14:40 37
Цитата Сообщение от alsav22 Посмотреть сообщение
Я правильно понял, что в студии это не UB?
Как себя ведёт студия, надо смотреть в доке по студии.
http://msdn.microsoft.com/en-u... xkb5c.aspx
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2014, 14:51 38
Значит, в студии, это не UB.
0
18.03.2014, 14:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2014, 14:51
Помогаю со студенческими работами здесь

Что будет выводить puts, если в конце строки не будет нулевого байта
что будет выводить puts, если в конце строки не будет нулевого байта

Что будет если СО будет двигаться навстречу свету?
Пусть у нас есть луч света, движущийся навстречу СО. И пусть СО тоже двигается прямолинейно со...

Теоретически! Если на сайте не будет не какой текстовой информации то и найти на нём что то будет не возможным (внутри)?
Вот чисто к примеру есть раскамнадзары и прочие ухари.... Вот как они ищут сайты !? Я к примеру...

Что делать с preloader-ом, если запрос произошёл слишком быстро?
Что делать с preloader-ом, если запрос произошёл слишком быстро? Ну, например, есть у меня корзина...

Подскажите что делать, если слишком долгая загрузка WIN 8.1 X64
Ну очень долгая загрузка наблюдается после переустановки ШINDOWS, я переустанавливался с WIN 7 X32...

что будет если отключить встроеный видеоадаптер через деспечер устройств если дескретной видеокарты нет?
что будет если отключить встроеный видеоадаптер через деспечер устройств если дескретной видеокарты...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru