union is a user-defined type that uses same block of memory for
every its list member
Union may be useful when it is necessary to work with different representation of same binary data. For example, you need to store color data as four 8-bit unsigned char numbers. At the same time, you have to store this color data as one 32-bit unsigned integer. Union allows to use both representation(struct with 4 unsigned char and unsigned integer) at the same time, using same block of computer's memory. The union is declared as: union union-type-name { union-list } union-variable;In this form, union-type-name is optional. However, if you want to use union type in several places, it is better to use another way of enum declaration: union union-type-name { union-list };Of course, in the second case union-type-name cannon be omitted. Example: declaring union type for color data source code: C++ union u_color { // first representation (member of union) struct s_color { unsigned char a, b, g, r; } uc_color; // second representation (member of union) unsigned int i_color; }; ?> After declaration, it is possible to use union-type-name as user-defined type. Following example demonstrates basic union usage. It reads file which contains 32 bit unsigned ints and decodes it to four 8 bit RGBA (Red, Green, Blue, Alpha-Transparency) values. source code: C++ #include <iostream> #include <stdio.h> using namespace std; union u_color { // first representation (member of union) struct s_color { unsigned char a, b, g, r; } uc_color; // second representation (member of union) unsigned int i_color; }; int main(void) { FILE *f = fopen("color.dat", "rb"); if (f == NULL) exit(1); fseek(f, 0, SEEK_END); size_t size = ftell(f); // file size in bytes fseek(f, 0, SEEK_SET); size /= 4; // file size in 32bit ints for(size_t i=0; i<size; i++) { u_color clr; //reading from tile to clr.i_color fread(&clr.i_color, sizeof(unsigned int), 1, f); // printing from clr.uc_color to output stream cout << "R=" << int(clr.uc_color.r) << " "; cout << "G=" << int(clr.uc_color.g) << " "; cout << "B=" << int(clr.uc_color.b) << " "; cout << "A=" << int(clr.uc_color.a) << endl; } fclose(f); }
|
|