GorvGoyl
GorvGoyl

Reputation: 49200

unable to understand the output of union program in C

I know the basic properties of union in C but still couldn't understand the output, can somebody explain this?

#include <stdio.h>

int main()
{
        union uni_t{
                int i;
                char ch[2];
        };
        union uni_t z ={512};
        printf("%d%d",z.ch[0],z.ch[1]);
        return 0;
}

The output when running this program is

02

Upvotes: 1

Views: 579

Answers (3)

Pratyush Khare
Pratyush Khare

Reputation: 688

Using int will not lead to this output in 32 bit machines as sizeof(int) = 4. This output will occur only if we use a 16 bit system or we use short int having memory size of 2 bytes.

A Union is a variable that may hold (at different times) objects of different types and sizes, with the compiler keeping track of size and alignment requirements.

union uni_t
{
      short int i;
      char ch[2];
};

This code snippet declares a union having two members- a integer and a character array. The union can be used to hold different values at different times by simply allocating the values.

union uni_t z ={512};

This defines a variable z of type union uni_t and initializes the integer member ( i ) to the value of 512.

So the value stored in z becomes : 0b0000 0010 0000 0000

When this value is referenced using character array then ch[1] refers to first byte of data and ch[0] refers to second byte.

ch[1] = 0b00000010 = 2 ch[0] = ob00000000 = 0

So printf("%d%d",z.ch[0],z.ch[1]) results to

02

Upvotes: 0

DevSolar
DevSolar

Reputation: 70263

union a
{
    int i;
    char ch[2];
}

This declares a type union a, the contents of which (i.e. the memory area of a variable of this type) could be accessed as either an integer (a.i) or a 2-element char array (a.ch).

union a z ={512};

This defines a variable z of type union a and initializes its first member (which happens to be a.i of type int) to the value of 512. (Cantfindname has the binary representation of that.)

printf( "%d%d", z.ch[0], z.ch[1] );

This takes the first character, then the second character from a.ch, and prints their numerical value. Again, Cantfindname talks about endianess and how it affects the results. Basically, you are taking apart an int byte-by-byte.

And the whole shebang is apparently assuming that sizeof( int ) == 2, which hasn't been true for desktop computers for... quite some time, so you might want to be looking at a more up-to-date tutorial. ;-)

Upvotes: 2

Cantfindname
Cantfindname

Reputation: 2138

What you get here is the result of endianess (http://en.wikipedia.org/wiki/Endianness).

512 is 0b0000 0010 0000 0000 in binary, which in little endian is stored in the memory as 0000 0000 0000 0010. Then ch[0] reads the last 8 bits (0b0000 0010 = 2 in decimal) and ch[1] reads the first 8 bits (0b0000 0000 = 0 in decimal).

Upvotes: 1

Related Questions