Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 20:25   #1
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию Неправильное значение переменной типа long

Код:
#include <stdio.h>
void main(){
   long a;
   a = 256*800;
   printf("%d",a);
}
Выводит значение 8192 =/ . Подскажите в чем может быть проблема?
Компилятор старенький Borland C++ v3.1
Einsttein вне форума Ответить с цитированием
Старый 13.03.2010, 20:35   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Мб потому, что в 3.1 int занимает два байта, ибо там же 16 битное все...
Объяснить не могу %)
Либо дело в принтфе...пробуй спецификатор "%l" вместо d, ибо он получается берет наверное первые два байта Long'a....что-то наверняка из-за этого
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 13.03.2010, 20:48   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

RoS прав, только не "%l", а "%ld"
netrino вне форума Ответить с цитированием
Старый 13.03.2010, 21:44   #4
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от RoS Посмотреть сообщение
Мб потому, что в 3.1 int занимает два байта, ибо там же 16 битное все...
Объяснить не могу %)
Либо дело в принтфе...пробуй спецификатор "%l" вместо d, ибо он получается берет наверное первые два байта Long'a....что-то наверняка из-за этого
Опробывал спецификатор %ld. Не помагло =( Если просто записать в эту переменную число 204800, то все норм. Грешу на компилятор =/
Einsttein вне форума Ответить с цитированием
Старый 13.03.2010, 22:01   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
#include <stdio.h>

int main(){
   double a;
   a = 256*800;
   printf("%10.0lf\n",a);

   return 0;
}
Среда Visual C++ 6.0.
profi вне форума Ответить с цитированием
Старый 13.03.2010, 22:06   #6
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию

Опробывал код на Visual C++ 6.0 Результат положительный, значит грешил borland C++ 3.1. Печально...
Einsttein вне форума Ответить с цитированием
Старый 13.03.2010, 23:52   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Известный ньюанс. Если даже с double делать, верёт всё-равно 8192.
При вычислении a = 256*800 компилятор занесёт в память 2-байтовое число 256 (или 800 точно не скажу) даже если объявить как 4-х байтовое (это из-за того что оба числа могут поместиться в 2 байта по отдельности), затем к этому 2-х байтовуму числу применит умножение на 800 и сохранит по адресу где было первое число и только потом передаст в тип double, естественно 256*800 в 2 байта не влезает, отсюда и результат.
Выход в разделении операции на 2 части (тип естественно 4-х байтовый)
Код:
void main(){
	long a;
	a = 256;
	a = a*800;
	printf("%ld",a);
}
Следующий пример убедит в правильности размышлений
Код:
void main(){
	long a;
	a = 10*32768;//заменив 32768 на 32767 мы и попадаем в ловушку хитрого компилятора
	printf("%ld",a);
}
eoln вне форума Ответить с цитированием
Старый 14.03.2010, 00:55   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
При вычислении a = 256*800 компилятор занесёт в память 2-байтовое число 256 (или 800 точно не скажу) даже если объявить как 4-х байтовое
Вы, кстати, скорее всего правы, не подумал об этом даже )
По-видимому именно для решения подобных проблем ввели литерал длинных чисел - L
Код:
a = 256L * 800;
Такое должно работать )
netrino вне форума Ответить с цитированием
Старый 15.03.2010, 10:04   #9
ezus
Пользователь
 
Регистрация: 08.05.2009
Сообщений: 78
По умолчанию

Красиво и просто!!!!
ezus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Значение переменной 4BlooD Общие вопросы Delphi 2 20.01.2010 16:09
перевод строки в long long и обратно Dimarik Общие вопросы C/C++ 9 16.09.2009 13:27
Определение типа переменной Игорь007 Общие вопросы C/C++ 7 10.01.2009 13:01
присвоить переменной целого типа значение поля key полученное в результате выполнения SQL запроса Worms БД в Delphi 5 10.01.2008 21:07