Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как записать в переменную большое число? 
:(
    Опции темы
Alexey91
Дата 15.9.2011, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Здравствуйте!

Использую компилятор dev cpp.
int - 4 байта
long int - тоже 4
long long int - 8 

Хорошо, 8 байтов. Т.е. 2^64 можно составить разных строк.

Пытаюсь присвоить число, ну например, 5 миллиардов.

Как это выглядит в коде:

unsigned long long int a;
scanf("%ld",&a);
printf("%ld",a);

Выводит число меньше чем миллиард.

В чем может быть дело?
PM   Вверх
azesmcar
Дата 15.9.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



замени %ld на %lld.

Это сообщение отредактировал(а) azesmcar - 15.9.2011, 13:33
PM   Вверх
Alexey91
Дата 15.9.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Цитата

замени %ld на %lld.

Не работает. Выдается тот же результат
PM   Вверх
azesmcar
Дата 15.9.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Alexey91 @  15.9.2011,  13:26 Найти цитируемый пост)
dev cpp

это не компилятор, компилятор по всей видимости MinGW, назови версию.
PM   Вверх
Alexey91
Дата 15.9.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



В журнале компиляции нашел строчку gcc\mingw32\3.4.2 ...
Dev-C++ 4.9.9.2
PM   Вверх
azesmcar
Дата 15.9.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Скорее всего просто не поддерживается, можешь еще попробовать %I64d, некоторые источники утверждают, что под windows это работает. smile 
PM   Вверх
newbee
Дата 15.9.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 3
Всего: 19



Используй std::cin>>, std::cout<<, они перегружены под различные типы (под long-long наверное тоже). Но вообще полагаться на long-long тем более в связке с stdio - крайне дурная затея, непортабельно. Лучше воспользуйся int64_t из stdint.h, которая из C99. int64_t может не оказаться на какой-нибудь экзотической системе (с семибитным байтом напримерsmile ) и ты получишь ошибку, поверь, это лучше, чем потом искать ошибку, вызванную переполнением.

http://stackoverflow.com/questions/126279/...s-visual-studio


--------------------
You're face to face
With man who sold the world
PM   Вверх
Alexey91
Дата 15.9.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



azesmcar, I64d сработало!!! 
А откуда этот спецификатор??

newbee, тогда я не понимаю, что делать. Если с std дурная затея. int_64t может не оказаться.
что к чему?

Добавлено через 11 минут и 5 секунд
Кстати, если использовать cin, то тоже все прекрасно работает
PM   Вверх
newbee
Дата 15.9.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 3
Всего: 19



Цитата(Alexey91 @  15.9.2011,  15:11 Найти цитируемый пост)
newbee, тогда я не понимаю, что делать. Если с std дурная затея. int_64t может не оказаться.
что к чему?
В случае с long-long и экзотическими спецификаторами для printf ты рискуешь нарваться на систему, в которой long-long не будет равен 64 битам (эта вероятность стремится к 1, учитывая факт увеличения битности процессоров). В лучшем случае ты будешь плясать вокруг магических ключей для printf, в худшем, если long-long будет к примеру 32битным, - получишь трудноуловимую ошибку, связанную с переполнением переменной. В случае отсутствия у компилятора int64_t ты просто найдешь аналог под этот тип, эта ошибка легко детектится на этапе компиляции.


--------------------
You're face to face
With man who sold the world
PM   Вверх
volatile
Дата 15.9.2011, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Alexey91 @  15.9.2011,  14:11 Найти цитируемый пост)
I64d сработало!!! 

Цитата(Alexey91 @  15.9.2011,  13:26 Найти цитируемый пост)
unsigned long long int a;

надо I64u
PM MAIL   Вверх
bsa
Дата 16.9.2011, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Alexey91 @  15.9.2011,  14:11 Найти цитируемый пост)
newbee, тогда я не понимаю, что делать. Если с std дурная затея. int_64t может не оказаться.
что к чему?
проблема не в std, а в выводе средствами stdio.h. Все стандартные типы он поддерживает, а вот с нестандартными большие проблемы. Отсюда и возникают левые спецификаторы и пр...
В этом плане потоки С++ значительно лучше. Даже если на "экзотической системе" int64_t не окажется, то собирающий программу получит вменяемую ошибку компиляции. А это значительно лучше, чем крах в неожиданном месте много где стабильно работающей программы. Делая прогу полагаясь на авось это все равно, что изображать страуса - пока не на бетонном полу все хорошо...


Это сообщение отредактировал(а) bsa - 16.9.2011, 08:41
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.