К сожалению, описание конкретного поведения Unions in C
в онлайн-ресурсах (я могу перечислить несколько, если требуется), значительно отличается от одного источника к другому, а в некоторых случаях недостаточно. Один из ресурсов говорит: You can define a union with many members, but only one member can contain a value at any given time.
и вот об этом. А потом еще один ресурс, говорит, in union, the only member whose value is currently stored will have the memory.
Итак, теперь, если я запускаю эту программу,Совместное использование памяти для объединений в C
#include <stdio.h>
union item
{
int a;
float b;
char ch;
};
int main()
{
union item it;
it.a = 12;
it.b = 20.2;
it.ch='z';
printf("%d\n",it.a);
printf("%f\n",it.b);
printf("%c\n",it.ch);
return 0;
}
я получаю выход как:
1101109626
20.199940
z
Интернет-сайт утверждает, что и б оба поврежден, хотя я немного не согласен здесь, так как b
близок к 20.2. Во всяком случае, теперь, если я пишу char в начале, а затем пишу a и b (все тот же формат), я вижу, что b
имеет правильное значение, но другие два повреждены. Однако, если я объявляю b
как int, a
и b
оба правильные. Поэтому я выводю, что если члены союза имеют одинаковый формат, тогда, когда вы пишете какой-либо один член, остальные члены WILL содержат одинаковое значение (поскольку они имеют одинаковый формат), которые вы можете читать в любое время без любая проблема. Но если они все разные, то тот, который был написан последним, является только действительным значением. Я не нашел онлайн-ресурса, в котором говорится об этом категорически. Правильно ли это предположение?
Если союз будет иметь ту же семантику, что и 'struct', это было бы бесполезно, не так ли? – Olaf
c также поврежден, но в случае float litle-endiann может быть только дробная часть и может содержать только младший 8 бит. Поплавок IEEE-32Bit имеет 24 битовых бинарных знака, поэтому вы можете иметь относительную ошибку 2^24/2^8 = 2^-16 = 1.5e-5 – 12431234123412341234123