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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2014, 22:21   #31
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Размер float 4 байта. Если x - указатель на float, то FE44 - 2 * sizeof(float) = FE44 - 8 = FE3C.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.01.2014, 22:42   #32
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

BDA, действительно float 4 байта, я упустил это.А как тогда это связано с этим X=FE44 X+=2 X=FE54?Возможно где-то в программе X указывает на double, но такого нигде нет, да и причем у вообще это не ясно.
East Undia Trading вне форума Ответить с цитированием
Старый 08.01.2014, 22:56   #33
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

1) Выложите как можно более короткую программу, где ясно видно, что
Цитата:
X=FE44
X-=2;
X=FE3C
Но если
X=FE44
X+=2;
То буде X=FE54
2) Важен тип указателя, а не то, что действительно лежит по адресу
3) Воспользуйтесь советом Stiletа и научитесь пользоваться отладчиком
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.01.2014, 23:04   #34
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Stilet, да, на каникулах подружусь с отладчиком.
У меня адресная арифметика одну лабораторную, если будет необходимость разберусь с ней, сейчас важнее другие темы и предметы.Но на экзамене будут по указателям спрашивать, справлюсь.
East Undia Trading вне форума Ответить с цитированием
Старый 13.01.2014, 20:28   #35
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Что выведет данный кусок программы относящейся к программе выше?
float y;
float *x=&y;
*x=1;
printf("%f %f\n", *x,y);
int *a=(int*a)&y;
printf("%d %d\n", *a, (int)y);
double *m=(double*)&y;
*m=1;
printf("%lf %lf\n", *m, (double)y);
Вот что у меня получилось:

1.000000 1.000000
1 0
1.000000 1.000000

Вопрос был такой, почему во второй строке строке ноль?
East Undia Trading вне форума Ответить с цитированием
Старый 13.01.2014, 20:56   #36
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Как я понимаю что-то связано с мантисой и представлением чисел в памяти компьютера.
East Undia Trading вне форума Ответить с цитированием
Старый 14.01.2014, 21:21   #37
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Пробежался отладчиком.
Честно, я что-то до сих пор таким образом не баловался, да и в голову не приходило.
Ох уж эти опасные преобразования, но понимать такие вещи надо!
И почему я всегда боялся подобных экспериментов?
Код:
double *m=(double*)&y;
Код:
*m=1;
Подскажите, кто знает.
Почему после этого присваивания y и x обнуляются?
Аж интересно стало.
У нас указатель типа double, который как бы подразумевает в себе, что он ссылается на 8 байт, стал ссылаться на область в размере 4 байта. Записав в эту область единицу. Она же как бы как была 4 байта, так и осталась.
Только указатель double эту область интерпретирует эту область как 1, а float как нуль.
Так если еще после этого присвоения изменить значение области через указатель y, то прям какая то магия - по одному и тому же адресу 2 значения.
Если рассуждать логически, то после считывания по указателю double (учитывая что он ссылается на область в 4 байта) там была бы каша.
Спасибо!
P.S. Ведь есть же знатоки плюсов, очень жду вашей помощи
Базиля вне форума Ответить с цитированием
Старый 14.01.2014, 21:32   #38
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Читал только последний пост..

Цитата:
Почему после этого присваивания y и x обнуляются?
Не вижу X
И какой тип Y?
Poma][a вне форума Ответить с цитированием
Старый 14.01.2014, 22:28   #39
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Ну здесь в принципе в последнем посте вся соль
X - вторая строчка
Y - первая
Y - float
Базиля вне форума Ответить с цитированием
Старый 14.01.2014, 22:49   #40
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
X - вторая строчка
Y - первая
Не понимаю..

Цитата:
Почему после этого присваивания y и x обнуляются?
Как говорит Си.. float - 4 б double - 8 б
Ты берешь указатель на float (указатель на 4 б)
Превращаешь его в указатель на 8 б
Заносишь по адресу 1-ку..
Единичка заносится в самый крайний бит! Тем самым мы (возможно) изменили значение последнего байта на 1-ку! А в остальные идут 0..
А теперь угадай чем будет равна переменная, если на всех двоичный разрядах у неё - нули..?

UPDATE
Я решил проверить..
тыц.. Почему тогда a[1] != 1?

Последний раз редактировалось Poma][a; 14.01.2014 в 22:56.
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Известны фамилии,адреса и телефоны 25-ти человек,Найти фамилии и адреса людей,чей телефон начинается с цифры 3. Расмотреть два слу salomon93 Паскаль, Turbo Pascal, PascalABC.NET 11 01.12.2011 23:36
адресная арифметика sterh11001100 Microsoft Office Excel 1 08.12.2010 13:20
Адреса переменных rommster Visual C++ 1 26.11.2010 08:35
Адресная арифметика и матрица. GrindeX Общие вопросы C/C++ 8 08.03.2010 15:03
Адресная книга Snake_ua PHP 6 26.02.2008 09:40