|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
||||||
Как работает reinterpret_cast?07.11.2014, 07:04. Показов 10382. Ответов 20
Метки нет (Все метки)
не пойму как работает reinterpret_cast? вот если мне надо например данные привести в бинар для сохранения в файл, я пишу:
0
|
||||||
| 07.11.2014, 07:04 | |
|
Ответы с готовыми решениями:
20
Приведение типов: как работает reinterpret_cast<>() ? reinterpret_cast Reinterpret_cast |
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 07.11.2014, 07:15 | |
|
Что за обратное преобразование?
1
|
|
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
|
| 07.11.2014, 07:17 [ТС] | |
|
0
|
|
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|||||||||||||||||
| 07.11.2014, 07:18 | |||||||||||||||||
А то, что у вас написано
Обратное преобразование
Никакой дополнительной памяти ни для одного из этих преобразований не нужно, ни статической, ни динамической. Никакого выделения памяти тут нет. Откуда вы взяли эту идею про дополнительную память мне не ясно.
4
|
|||||||||||||||||
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
|
| 07.11.2014, 07:25 [ТС] | |
|
TheCalligrapher, ваш вариант абсолютно не рабочий, мой работает отлично, какие проблемы? вы бы хоть протестили прежде чем утверждать
Добавлено через 3 минуты но во всяком случае я теперь понял, значит буффером используется память статически выделенная для статической переменной value, соответственно работы с динамической памятью нет и ничего освобождать не надо так?
0
|
|
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|||||||
| 07.11.2014, 07:26 | |||||||
|
Показываю еще раз:
Где вы тут увидели что-то "нерабочее"?
0
|
|||||||
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
||
| 07.11.2014, 07:28 [ТС] | ||
|
0
|
||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|||||||
| 07.11.2014, 07:34 | |||||||
|
В данном случае прямое преобразование - то преобразование значения '&value' типа 'int *' в тип 'char *'. Соответственно обратное преобразование в этом случае - это преобразование типа 'char *' в тип 'int *'
1
|
|||||||
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
||
| 07.11.2014, 07:39 [ТС] | ||
|
Добавлено через 2 минуты а вот как мне соединить несколько таких бинарных переменных в одну? мне надо сделать сериализацию данных класса, в задании сказано что "– Serialize – функция сериализация данных. Функция должна сохранять все свои данные в буфер, указанный в параметрах функции.", т.е. я переделываю все переменные класса в эдакие бинарные буферы, и потом мне надо вернуть это все в одной переменной... как мне их объединить?
0
|
||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||||||||||||
| 07.11.2014, 07:42 | ||||||||||||
|
Если сделать так
Тут, разумеется, есть тонкости. Во-первых, если адрес на данной платформе не помещается в 'int', то значение в 'another_value' получится "обрезанным". Во-вторых, какой-то бит адреса попадет в знаковый бит 'int', и если этот бит равен 1, то результат в 'another_value' получится отрицательным. Для подобных манипуляций не рекомендуется использовать знаковые типы. В заголовочном файле <cinttypes> есть специальный тип 'uintptr_t', который как раз и предназначен для подобных манипуляций. Т.е.
0
|
||||||||||||
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
||||||||||
| 07.11.2014, 07:58 [ТС] | ||||||||||
|
Добавлено через 4 минуты однако...
а что по сериализации подскажете?
0
|
||||||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|||||||
| 07.11.2014, 08:04 | |||||||
|
Во-первых, даже язык С запрещает неявное преобразование указателей в целые и обратно. Такое преобразование в языке С всегда требует явного приведения типа, т.е. каста.
Во-вторых, в языке С++ при помощи 'reinterpret_cast' можно выполнять преобразование указателей к целочисленным типам даже если целевой тип слишком мал. Утверждение вышепроцитированного автора о том, что 'reinterpret_cast' не позволит этого сделать - ложно. 'reinterpret_cast' просто породит какой-то "урезанный" результат.
1
|
|||||||
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
|
| 07.11.2014, 08:09 [ТС] | |
|
0
|
|
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|||||||
| 07.11.2014, 08:23 | |||||||
|
В языке С (как и в С++) почти любой фундаментальный тип формально может иметь "запрещенные" представления, т.е. запрещенные комбинации битов. Такие запрещенные представления называются по-английски "trap representations". Если в программе какая-то переменная получит такое запрещенное представление, что чтение такой переменной формально приводит к неопределенному поведению, т.е. программа формально имеет право "упасть и взорваться". Например, если мы возьмем указатель типа 'int *' и направим его на память, содержащую какие-то непредсказуемые случайные значения
Другими словами, читать из памяти что попало через указатель типа 'int *' - опасно (опять же - из формальных академических соображений). Это относится и ко все другим типам, за исключением одного - 'unsigned char'. Тип 'unsigned char' гарантировано не имеет запрещенных представлений. Это - единственный такой тип. Т.е. через тип 'unsigned char' разрешается читать любое совершенно непредсказуемое содержимое памяти и вы гарантированно некогда не наткнетесь на запрещенное представление, потому что у типа 'unsigned char' их просто нет. Поэтому для работы с произвольными бинарными данными рекомендуется использовать именно 'unsigned char'.
1
|
|||||||
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
|||||||
| 07.11.2014, 09:13 [ТС] | |||||||
0
|
|||||||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 07.11.2014, 09:19 | |
|
TheCalligrapher, что это за запрещённые представления для int? Впервые слышу. Пример, приведи.
0
|
|
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
||||||
| 07.11.2014, 09:29 [ТС] | ||||||
|
хмм а с динамической памятью кстати такой номер почему то не проходит...
0
|
||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||
| 07.11.2014, 09:45 | ||
|
Я же ясно сказал: спецификация языков С и С++ формально допускает существование "запрещенных" комбинаций битов для всех типов, кроме 'unsigned char'. Это не значит, что такие комбинации встречаются на повседневных практических платформах для типа 'int'. Цель такой спецификации trap representation - допустить существование платформ, которые, например, хранят в данных дополнительные "проверочные" признаки. Например, платформы с явно хранимым битом четности. Если бит четности содержит "неправильное" значение, т.е. если данные не проходят проверку по четности, то такое представление является trap representation. Обыкновенная платформа с 32-битным 'int' и представлением отрицательных чисел через "дополнение до 2" имеет право ограничить диапазон типа 'int' как [-2147483647, 2147483647], а значение '-2147483648' (0x80000000) зарезервировать, как запрещенное. И т.д. и т.п. Можно также упомянуть платформу ia64 (Itanium). Там если целочисленная переменная представлена регистром, то такой регистр может получить особенное значение - NaT (например, если переменная не инициализирована или если она прочитана из недоступной памяти). NaT на Itanuim - классический пример trap representation.
2
|
||
|
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
|
||||||||||||||||
| 07.11.2014, 10:00 [ТС] | ||||||||||||||||
|
ЛЮДИ !!! 2 вопроса пожалуйста ответьте уже !!!!!
1. почему не срабатывает обратное преобразование, если память выделялась динамически (точнее срабатывает, но в переменную записывается адрес, несмотря на разыменование) 2. как быть с сериализацией? (описывал выше) Добавлено через 3 минуты
0
|
||||||||||||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||||||||
| 07.11.2014, 10:06 | ||||||||
|
Вы написали функцию 'bin', которая возвращает указатель на ее аргумент. Теперь вы делаете вот это
'reinterpret_cast' выше читает значение указателя 'value', интерпретируя его память как объект типа 'int'. В результате в 'x' ложится содержимое 'value' (проинтерпретированное в памяти как 'int'). Это численное значение адреса, возвращенное когда-то 'new' (возможно урезанное). А что ожидалось то? Добавлено через 1 минуту Разумеется, код будет работать по разному.
0
|
||||||||
| 07.11.2014, 10:06 | |
|
Помогаю со студенческими работами здесь
20
reinterpret_cast<...>(...)
Преобразование (reinterpret_cast) Оператор reinterpret_cast Reinterpret_cast и указатели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|