-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
1

Объединение двух типов

11.03.2019, 08:00. Показов 2045. Ответов 31
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    union 
{
    int x;
    float y;
};
    y=16.05;
    x++;
    cout << y;
    return 0;
}
Программа печатает 16.05. Как это можно объяснить?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2019, 08:00
Ответы с готовыми решениями:

Объединение символьных типов в одну переменную (char)
Возник вопрос. Можно ли как-то объеденить несколько символьных типов к примеру, что-то...

Определить объединение из двух полей Первое поле - массив из двух байт, второе - слово
Помогите написать программу( лучше с комментариями чтобы разобраться) Определить объединение из...

Определить объединение из двух полей. Первое поле - массив из двух байт, второе - слово
Определить объединение из двух полей. Первое поле - массив из двух байт, второе - слово. Ввести x...

Объявить объединение из двух структур и структуру из двух объединений
Объявить объединение из двух структур и структуру из двух объединений. Заполнить значениями,...

31
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
11.03.2019, 08:17 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{
    union
    {
        int x;
        float y;
    } myunion;
    myunion.y = 16.05;
    myunion.x++;
    cout << myunion.x << endl;
    cout << myunion.y << endl;
    system("pause");
    return 0;
}
Кстати, может этот вопрос и поднимался. Кто-нибудь может ответить зачем нужны union, когда нужно использовать их, а не например структуры
За время учебы union не разу не использовал, поэтому и спрашиваю
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 08:27 3
Цитата Сообщение от Jzx Посмотреть сообщение
Программа печатает 16.05. Как это можно объяснить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    union 
{
    int x;
    float y;
};
    y = 16.05;
    cout << setprecision(9) << y << endl;
    x++;
    cout << setprecision(9) << y << endl;
}
Но вообще это UB.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
11.03.2019, 08:51 4
Цитата Сообщение от Andrey B Посмотреть сообщение
Кстати, может этот вопрос и поднимался. Кто-нибудь может ответить зачем нужны union, когда нужно использовать их, а не например структуры
Очень удобны, например, для доступа к отдельным битам целочисленного значения. Буквально на днях решал задачку и как раз использовал union в функции зеркалирования байта:

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
std::uint8_t mirror_bits(std::uint8_t byte) {
    struct bits_t {
        std::uint8_t bit_0 : 1;
        std::uint8_t bit_1 : 1;
        std::uint8_t bit_2 : 1;
        std::uint8_t bit_3 : 1;
        std::uint8_t bit_4 : 1;
        std::uint8_t bit_5 : 1;
        std::uint8_t bit_6 : 1;
        std::uint8_t bit_7 : 1;
    };
    union {
        std::uint8_t the_byte;
        bits_t bits;
    };
    bits.bit_0 = (byte & 0x80) >> 7;
    bits.bit_1 = (byte & 0x40) >> 6;
    bits.bit_2 = (byte & 0x20) >> 5;
    bits.bit_3 = (byte & 0x10) >> 4;
    bits.bit_4 = (byte & 0x08) >> 3;
    bits.bit_5 = (byte & 0x04) >> 2;
    bits.bit_6 = (byte & 0x02) >> 1;
    bits.bit_7 = (byte & 0x01);
    return the_byte;
}
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 09:09 5
Цитата Сообщение от jugu Посмотреть сообщение
Буквально на днях решал задачку и как раз использовал union в функции зеркалирования байта
Решение имеет неопределённое поведение.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
11.03.2019, 09:30 6
Цитата Сообщение от rat0r Посмотреть сообщение
Решение имеет неопределённое поведение.
Всё работает прекрасно.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
11.03.2019, 09:38  [ТС] 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    union 
{
    int x;
    float y;
};
    y=16.05;
    x+=100;
    cout << y;
    return 0;
}
Программа печатает 16.0502
Я думаю, в первом примере всё работает правильно: инструкция x++; действительно позволяет получить следующий флоат, увеличивая на единицу битовое представление его значения. Проблема должна быть в инструкции cout << y;. Скорее всего она выводит результат с некоторой точностью, и этой точности недостаточно, чтобы увидеть изменения невооруженным глазом.

Добавлено через 1 минуту
Пусть старшие товарищи поправят меня, если что не так.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 10:23 8
Цитата Сообщение от jugu Посмотреть сообщение
Всё работает прекрасно.
Тем не менее, поведение не определено.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
11.03.2019, 10:49 9
Цитата Сообщение от rat0r Посмотреть сообщение
Тем не менее, поведение не определено.
Точнее, определяется реализацией. Согласно стандарту, 8 битовых полей будут в одной ячейке, но порядок их следования внутри ячейки в стандарте не указан и определяется разработчиком компилятора.
0
Don't worry, be happy
17752 / 10522 / 2028
Регистрация: 27.09.2012
Сообщений: 26,497
Записей в блоге: 1
11.03.2019, 10:52 10
jugu, нет, оно именно неопреденное.
Здесь чтение из неактивного поля объединения.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 10:52 11
Цитата Сообщение от jugu Посмотреть сообщение
Точнее, определяется реализацией. Согласно стандарту, 8 битовых полей будут в одной ячейке, но порядок их следования внутри ячейки в стандарте не указан и определяется разработчиком компилятора.
Это вообще не при чём. Неопределённое поведение из-за чтения объекта вне его времени жизни (неактивный член объединения).
0
Don't worry, be happy
17752 / 10522 / 2028
Регистрация: 27.09.2012
Сообщений: 26,497
Записей в блоге: 1
11.03.2019, 10:56 12
jugu, Andrey B, Приведение указателя базового типа
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
11.03.2019, 11:01 13
Цитата Сообщение от Croessmah Посмотреть сообщение
jugu, нет, оно именно неопреденное.
Здесь чтение из неактивного поля объединения.
Что есть "активное" поле и "не активное"? Где почитать? В 3-х средах все отлично работает. И подобный код есть в некоторых библиотеках, это не мое "изобретение".
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 11:02 14
Цитата Сообщение от jugu Посмотреть сообщение
Что есть "активное" поле
https://timsong-cpp.github.io/... ion_member
0
Don't worry, be happy
17752 / 10522 / 2028
Регистрация: 27.09.2012
Сообщений: 26,497
Записей в блоге: 1
11.03.2019, 11:04 15
jugu, прямо в стандарте и написано что такое активное поле, и когда оно становится активным.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
11.03.2019, 11:11 16
Цитата Сообщение от Croessmah Посмотреть сообщение
jugu, прямо в стандарте и написано что такое активное поле, и когда оно становится активным.
Да, это что-то новенькое для меня, если честно... Тогда не вижу смысла вообще использовать объединения. В старых версиях стандарта подобного не было. Можно было записать число целиком, а читать по частям.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 11:14 17
Цитата Сообщение от jugu Посмотреть сообщение
В старых версиях стандарта подобного не было.
Всегда было.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
11.03.2019, 11:19 18
Цитата Сообщение от rat0r Посмотреть сообщение
Всегда было.
Не припомню такого в 98-м и 03-м. И не понимаю, почему введен запрет на доступ к одному и тому же участку памяти через разные поля объединения... Это весьма удобно и эффективно. Я понимаю, что могут быть "сюрпризы", если обращения в разных потоках, а битовые поля в одной ячейке.
0
Don't worry, be happy
17752 / 10522 / 2028
Регистрация: 27.09.2012
Сообщений: 26,497
Записей в блоге: 1
11.03.2019, 11:31 19
Цитата Сообщение от jugu Посмотреть сообщение
Не припомню такого в 98-м и 03-м.
Либо забыли, либо не смотрели.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
11.03.2019, 11:36 20
Цитата Сообщение от Croessmah Посмотреть сообщение
Либо забыли, либо не смотрели.
Да уж 1500 страниц помнить... это сильно ))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2019, 11:36
Помогаю со студенческими работами здесь

Создать объединение, что содержит элементы типов char int short fload long string
всем доброго времени суток! мне нужно создать объединение, что содержит элементы типов char int...

Объединение двух if
Можно ли как то объединить 2 if-а? #include &lt;iostream&gt; using namespace std; int main() {...

Отличие двух типов
Чем отличаются два типа: double и float? Напишите существенные отличия!

Объединение двух массивов
Ребята,срочно. Даны два масссива b и c как их объединить в один третий массив d например?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru