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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2014, 20:16   #51
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

С адресами всё в порядке.. косяк с указателями, а точнее с кол-вом байт, на которые они указывают..
нолик получается при *m = 1..
Poma][a вне форума Ответить с цитированием
Старый 19.01.2014, 20:37   #52
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Я про этот код.
#include <stdio.h>

int main(void) {
float y;
float *x=&y;
*x=1;
printf("%f %f\n", *x,y);
int *a=(int*)&y;
*a=1;
printf("%d %d\n", *a, (int)y);
double *m=(double*)&y;
*m=1;
printf("%lf %lf\n", *m, (double)y);
return 0;
}

1.000000 1.000000
1 0
1.000000 0.000000

Последний раз редактировалось East Undia Trading; 19.01.2014 в 20:40.
East Undia Trading вне форума Ответить с цитированием
Старый 19.01.2014, 21:23   #53
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Как получается ноль во второй строке?В *a=1?
East Undia Trading вне форума Ответить с цитированием
Старый 19.01.2014, 21:53   #54
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Очень просто..
а - указатель на int.. а в памяти, куда указывает a, хранится 00000001..
Выводим это число ввиде int'a и это 1-ка..

выводим y, приведенный к int'y.. сначала идет 1 бит - знак.. потом мантиса и порядок..
и рассмотрим (-1)^знак*мантису*2^порядок.. а в памяти это 00000001..
получаем (-1)^0*0*2^1.. и это 0..
Poma][a вне форума Ответить с цитированием
Старый 19.01.2014, 22:39   #55
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Poma][a, эта формула представления вещественных чисел в памяти компьютера, как я понимаю.Но какое тогда мы число представляем?Никак не могу связать ваш ответ с вопросом, почему и где получается ноль?
У нас был y-вещественный, указали на его адрес x, после чего занесли туда единицу.Дальше вывели y как целое...
East Undia Trading вне форума Ответить с цитированием
Старый 19.01.2014, 22:41   #56
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Число 1.. Мы же занесли его туда.. Но занесли, как целое число!

Дальше выводим как целое - ответ - 1.
Дальше выводим как вещественное, приведенное к целому.. И это 0.0000000.. А теперь приводим к целому.. Это 0
Poma][a вне форума Ответить с цитированием
Старый 19.01.2014, 22:58   #57
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

А можно в коде программы, в какой именно строчке, найти где данное действо происходит?
То есть изначально число (единица) записывается как

Потом выполняется операция и происходит

Тогда мы получаем ноль и во второй строке выводим его как целое число, а в третьей как вещественно?
East Undia Trading вне форума Ответить с цитированием
Старый 19.01.2014, 23:02   #58
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
int *a=(int*)&y;
*a=1;
printf("%d %d\n", *a, (int)y);
Вот тут..
Это общая формула.
А далее для нашего примера..
Про третюю строчку разговор отдельный.. Там еще фишка про взятие лишнего байта..
Poma][a вне форума Ответить с цитированием
Старый 19.01.2014, 23:26   #59
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

И все же, что происходит в третьей строчке?
Там, как я понимаю, преобразуется тип не адреса, а самой переменной.
East Undia Trading вне форума Ответить с цитированием
Старый 20.01.2014, 00:09   #60
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
int main(void) {
 float y;
 float *x=&y;// Указатель на указатель
 *x=1;
 printf("%f %f\n", *x,y);
 int *a=(int*)&y;
 *a=1;
 printf("%d %d\n", *a, (int)y);
 double *m=(double*)&y;
 *m=1;
 printf("%lf %lf\n", *m, (double)y);
 return 0;
 }
Указатель на указатель, ну не нужно так над языком выё.. ой выделаваться. Это удел профи, но не в Вашем случае.
Хотите получить значение переменной - делайте разыменование.
При Вашем уровне знаний, заниматься таким - рановато.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 20.01.2014 в 00:12.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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