С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.04.2023
Сообщений: 20
1

Union типы и какая то магия

19.08.2023, 10:47. Показов 616. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть функция, я так и не поняла почему тут используется union это первая проблема. А вторая если я даю функции dig_conv(123456.78), она возвращает какую-то магию, а как эту магию вернуть назад в тип float я совсем запуталась. Помогите пожалуйста.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
struct Byte {
    uint8_t b0;
    uint8_t b1;
    uint8_t b2;
    uint8_t b3;
}; 
 
union Data { 
    float num; 
    struct Byte bytes; 
}; 
 
std::string dig_conv(float c) {
    uint8_t c_arr[8];
 
    for (int i = 0; i < 8; i++)
        c_arr[i] = 0xff; 
 
    Data d;
    d.num = c; 
    c_arr[0] = d.bytes.b1; 
    c_arr[1] = d.bytes.b0; 
    c_arr[2] = d.bytes.b3; 
    c_arr[3] = d.bytes.b2; 
    c_arr[4] = (-(c_arr[0] + c_arr[1] + c_arr[2] + c_arr[3])) & 0xFF;
 
    std::stringstream ss;
    ss << std::hex << ((c_arr[0] >> 4) & 0x0F) << ((c_arr[0] >> 0) & 0x0F) << // 
        ((c_arr[1] >> 4) & 0x0F) << ((c_arr[1] >> 0) & 0x0F) << // 
        ((c_arr[2] >> 4) & 0x0F) << ((c_arr[2] >> 0) & 0x0F) << // 
        ((c_arr[3] >> 4) & 0x0F) << ((c_arr[3] >> 0) & 0x0F) << // 
        ((c_arr[4] >> 4) & 0x0F) << ((c_arr[4] >> 0) & 0x0F) << // 
        ((c_arr[5] >> 4) & 0x0F) << ((c_arr[5] >> 0) & 0x0F) << // 
        ((c_arr[6] >> 4) & 0x0F) << ((c_arr[6] >> 0) & 0x0F) << // 
        ((c_arr[7] >> 4) & 0x0F) << ((c_arr[7] >> 0) & 0x0F);
 
    return ss.str(); 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2023, 10:47
Ответы с готовыми решениями:

Return из события. Какая-то магия
Доброго времени суток. function validation(event) { event = event || window.event; ...

Конструкция switch - магия какая-то
Сел позавчера за изучение плюсов, изучаю по книжке В.В.Подбельского В этой книжке приведён пример...

Какая-то необъяснимая магия с вычислением
Есть у меня такая формула: totalSheetPrice = (circulation + (80 * faceColor + 80 * backColor)) /...

какая то черная магия при приеме по UART
Вообщем принимаю я две строки по UART, в блок switch все нормально приходит, первая строка &quot;АТ&quot;,...

В общем с моим компом творится какая то черная магия
Дело в том, что комп включается но нет изображения на монитор. Вроде бы все просто, либо мама...

16
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.08.2023, 11:05 2
Цитата Сообщение от Riona Посмотреть сообщение
почему тут используется union
чтобы разделить float num на 4 части по 8 байт.
А чтобы вернуть обратно в тип float надо проделать абсолютно то же что выше только в обратном порядке)
0
0 / 0 / 0
Регистрация: 14.04.2023
Сообщений: 20
19.08.2023, 11:08  [ТС] 3
Цитата Сообщение от ReYalp Посмотреть сообщение
в обратном порядке
В теории да, но на практике в течении месяца я так и не смогла ((( Даже не знаю как подойти к этому обратному порядку...
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.08.2023, 11:33 4
Лучший ответ Сообщение было отмечено Riona как решение

Решение

Riona,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
float hexToFloat(const std::string &hexStr) {
    uint8_t c_arr[8];
 
    for (int i = 0; i < 8; i++) {
        std::stringstream ss;
        ss << hexStr.substr(i * 2, 2);
        int hexValue;
        ss >> std::hex >> hexValue;
        c_arr[i] = static_cast<uint8_t>(hexValue);
    }
 
    Data d;
    d.bytes.b1 = c_arr[0];
    d.bytes.b0 = c_arr[1];
    d.bytes.b3 = c_arr[2];
    d.bytes.b2 = c_arr[3];
 
    return d.num;
}
1
2129 / 1212 / 503
Регистрация: 11.10.2018
Сообщений: 6,112
19.08.2023, 11:42 5
Читай документацию. Оператор struct и оператор union. float раскладывается на 4 байта. А порядок и любой потом можно будет сделать. Оператор >> 0 - сдвиг вправо числа на 0 бит, бессмысленный оператор.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.08.2023, 11:45 6
FFPowerMan,
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Оператор struct и оператор union.
Что такое operator struct. и operator union? Впервые слышу
0
2129 / 1212 / 503
Регистрация: 11.10.2018
Сообщений: 6,112
19.08.2023, 11:50 7
https://metanit.com/cpp/tutorial/5.8.php
https://www.bestprog.net/ru/20... ns_ru/#q02
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.08.2023, 11:51 8
FFPowerMan, а оператор где?)
0
0 / 0 / 0
Регистрация: 14.04.2023
Сообщений: 20
19.08.2023, 12:08  [ТС] 9
Цитата Сообщение от ReYalp Посмотреть сообщение
а оператор где?)
Наверное имелся ввиду оператор доступа ) Ну как обращаться к структуре я знаю
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
19.08.2023, 12:27 10
Цитата Сообщение от ReYalp Посмотреть сообщение
Что такое operator struct. и operator union? Впервые слышу
не верю, я уверен ты много раз слышал, как те или иные функции, ключевые слова и.т.д. некорректно называли операторами. Особенно на форумах в интернете.
Или ты читаешь только большие доки, а на форум впервые заглянул?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.08.2023, 12:29 11
Kuzia domovenok, на форум я вчера впервые заглянул с 2020го года)
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
19.08.2023, 12:41 12
ReYalp, ну вот зачем врёшь? поиск по форуму отлично работает!
Наследование шаблонного класса
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.08.2023, 12:45 13
Kuzia domovenok, я имел ввиду что зашел именно чтобы почитать форум) а не вопрос задать
0
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
19.08.2023, 12:52 14
Цитата Сообщение от ReYalp Посмотреть сообщение
я имел ввиду
Вот и FFPowerMan тоже имел ввиду.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.08.2023, 12:54 15
Kuzia domovenok, Хотя ты прав, оказывается я год назад задавал много вопросов, что меня сильно удивило. Я не врал, просто забыл
0
3718 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
19.08.2023, 12:56 16
ReYalp, сезон троллей )
0
0 / 0 / 0
Регистрация: 14.04.2023
Сообщений: 20
19.08.2023, 14:50  [ТС] 17
Всем спасибо
0
19.08.2023, 14:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2023, 14:50
Помогаю со студенческими работами здесь

Компилятор С как он анализирует сложные типы данных типа struct и union ?
1) Как компилятор С на этапе компиляции кода анализирует типы данных типа struct и union и...

Пользовательские типы в union - Нужно ли инстализировать как-то String, Object или Array?
Во всех примерах в union используют простые типы (int, float), а если в union будет...

Какая-то магия, проблема с черным экраном без курсора во вреся загрузки windows
Если кратко попытаться объяснить, то проблема возникла после резкого alt+tab. После перехода между...

union как определить из какой таблице запись после UNION?
Подскажите пожалуйста! Вот например две таблице (TEBLE_1) у которой поля row_1(BIGINT) и (TABLE_2)...

Предопределенные типы переменных. Простые типы данных. Пользовательские типы данных
Лабораторная работа №6. Тема: Предопределенные типы переменных. Простые типы данных....

Для введенного целого трехзначного числа определить, какая цифра в числе является первой, какая второй и какая третьей
Разработать программу, которая для введенного целого трехзначного числа определяет, какая цифра в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru