powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Правильно ли я понимаю нижеуказанное приведение данных?
10 сообщений из 10, страница 1 из 1
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421100
A.D.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый!

В книжке встретил такое приведение данных для записи в двоичный файл:
Код: plaintext
binfil.write(reinterpret_cast<char *>(&n),sizeof(n)); 
где
binfil - успешно открытый файловый поток
и
int n;

Сказано, что первый аргумент должен иметь тип char *. Соответственно, требуется приведение данных. Далее, идет такая фраза: "Выражение принимает адрес переменной n, но преобразует этот адрес к типу char *".
Правильно ли я понимаю, что, если на пальцах, данные по этому адресу приводятся к типу char, т.е. значение переменной n после приведения будет иметь тип char?
И второй вопрос. Почему приведение, в данном случае, осуществляется к типу char?


Заранее благодарен.
С уважением.
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421152
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.D.День добрый!

В книжке встретил такое приведение данных для записи в двоичный файл:
Код: plaintext
binfil.write(reinterpret_cast<char *>(&n),sizeof(n)); 
где
binfil - успешно открытый файловый поток
и
int n;

Сказано, что первый аргумент должен иметь тип char *. Соответственно, требуется приведение данных. Далее, идет такая фраза: "Выражение принимает адрес переменной n, но преобразует этот адрес к типу char *".
Правильно ли я понимаю, что, если на пальцах, данные по этому адресу приводятся к типу char, т.е. значение переменной n после приведения будет иметь тип char?
И второй вопрос. Почему приведение, в данном случае, осуществляется к типу char?


Заранее благодарен.
С уважением.
1) Неправильно. Ежели на пальцах указатель на int приводится к указателю на char. А вот с данными никто ничего не делает...
2) Надо в файл написать представление числа в виде набора байт, ни и приводит к соотвествующему виду ибо байт = 8 бит и char = 8бит. Ну можно привести еще к unsigned char
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421375
A.D.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded[quot A.D.]
1) Неправильно. Ежели на пальцах указатель на int приводится к указателю на char. А вот с данными никто ничего не делает...


Тогда, еще больше запутался. Если исходить из того, что есть указатель. Допустим, есть указатель int *p = 5. Если я правильно понимаю, то р - это адрес переменной, по которому хранится переменная типа int со значением 5.
Если мы приводим данные к другому типу, то тут понятно. К примеру, было значение int = 5, привели к double, стало значение double = 5.
Теперь. Что тогда происходит, в контексте, приведенной схемы, в том случае, если к другому типу приводится:
1. адрес?
2. указатель на один тип?

Если можно, с каким-нибудь простеньким примерчиком.


Заранее благодарен.
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421578
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.D.
Тогда, еще больше запутался. Если исходить из того, что есть указатель. Допустим, есть указатель int *p = 5. Если я правильно понимаю, то р - это адрес переменной, по которому хранится переменная типа int со значением 5.

А вот и не угадал. Это значит что p указывает на int, адрес которого в адресном пространстве процесса 5. И значение *з совсем не 5, а то что написано в 4 байтах начиная со смещения 5.

A.D.
Если мы приводим данные к другому типу, то тут понятно. К примеру, было значение int = 5, привели к double, стало значение double = 5.

А вот может и не повезти, особливо ежели большее к меньшему приводить...

A.D.
Теперь. Что тогда происходит, в контексте, приведенной схемы, в том случае, если к другому типу приводится:
1. адрес?
2. указатель на один тип?

Если можно, с каким-нибудь простеньким примерчиком.
Заранее благодарен.
Так совсем каша в голове. Адрес и указатель есть близнецы братья... Адрес - это 4 или 8 байтовое целое - индех ячейки памяти в адресном пространстве. Берешь адрес объекта (оператор &) в результате получаешь указатель. Теперь адрес можно по разному интерпретировать можно сказать что адрес 0x00C0FFEE - это int*, тогда 4 байта начиная с указанного байта программа интерпретирует как int, или сказать что это double* - тогда 8 байт начиная с subj будут интерпретированы как double
А вообще книжки читать надо
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421666
A.D.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Р указывает на int" - физически это как выглядит? В книжке приводилась такая схема:
int n = 5;
int *p;
р=&n;
*p = 5;

Т.е. физически р - это значение адреса, а *р - то, что хранится по этому адресу.

Теперь, если я Вас правильно понял, приведение типа указателя к другому - это физически означает, что от указанного адреса "отсчитывается" другое количество байт (при int - 4, при double - 8).

Я, дико извиняюсь, немного Вас помучаю!
Предположим, есть адрес- 1000. Если значение int, то 1000, 1001, 1002 и 1003 заняты этим значением. Допустим есть преобразование в double. Значит теперь имеем с 1000 по 1007. Так?
Тогда, что происходит с содержимым, хранящимся с 1000 по 10003?

Заранее спасибо.
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421706
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничего, гораздо более интересно что будет в другой части
сколько байт отсчитывать от начала зависит от того какой тип имеет указатель!

--------------------------------------------------------------
[подпись с другого сайта]
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421755
A.D.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. если ремзюмировать: фактически, приведение типа указателя к другому типу, это изменение количества отсчитываемых (от начального адреса) адресов?

Заранее спасибо.
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34421862
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.D."Р указывает на int" - физически это как выглядит? В книжке приводилась такая схема:
int n = 5;
int *p;
р=&n;
*p = 5;

Т.е. физически р - это значение адреса, а *р - то, что хранится по этому адресу.

Ну так! Если еще точнее *p это то как мы интерпретируем данные по этому адресу

A.D.Теперь, если я Вас правильно понял, приведение типа указателя к другому - это физически означает, что от указанного адреса "отсчитывается" другое количество байт (при int - 4, при double - 8).

Ну совсем. Это не только размер но и представление данных. Ведь если ежели у int все просто, то объект какого-нибудь класса - очень сложная структура

A.D.Я, дико извиняюсь, немного Вас помучаю!
Предположим, есть адрес- 1000. Если значение int, то 1000, 1001, 1002 и 1003 заняты этим значением. Допустим есть преобразование в double. Значит теперь имеем с 1000 по 1007. Так?
Тогда, что происходит с содержимым, хранящимся с 1000 по 10003?

Заранее спасибо.
Абстрагируйся от int, double и прочих типов и классов. Вот у компа есть память в нем байты лежат, эти байты можно по-раному интепретировать (жуткое слово но другое на ум не приходит)
Вот взял кучу байт и смотрю на них как на int, могу посмотреть на них как на double.
Могу взять и прибавить 1 к *(int*) 0x00C0FFEE; если теперь распечатать *(double*) 0x00C0FFE то результат будет ой-ой
сам попробуй
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
# include <iostream>
# include <iomanip>
using namespace std;

static unsigned char buf[ 8 ]; // статическая память инициализируется 0

int main()
{
    int* i = reinterpret_cast<int*>(buf);
    double* d = reinterpret_cast<double*>(buf);
    cout << "i = " << i << "; *i = " << *i < endl;
    cout << "d = " << d << "; *d = " << *d < endl;
    *i =  1 ;
    cout << "i = " << i << "; *i = " << *i < endl;
    cout << "d = " << d << "; *d = " << *d < endl;  
    return  0 ;
}
PS В приметы веришь? смени ник
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34422186
A.D.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно понял. Остался, тогда, последний вопрос. Меняется ли СУТЬ данных от такой интерпретации?
Ну, и как резюме: т.е. приведение указателя на данные к другому типу - это изменение размера данных + интерпретация данных с точки зрения типа, к которому мы приводим указатель?

Заранее спасибо.
...
Рейтинг: 0 / 0
Правильно ли я понимаю нижеуказанное приведение данных?
    #34422275
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.D.Примерно понял. Остался, тогда, последний вопрос. Меняется ли СУТЬ данных от такой интерпретации?
Ну, и как резюме: т.е. приведение указателя на данные к другому типу - это изменение размера данных + интерпретация данных с точки зрения типа, к которому мы приводим указатель?

Заранее спасибо.
Вот про размер выкинь и будет все ок! Ибо размер - определяется типом
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Правильно ли я понимаю нижеуказанное приведение данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]