## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Union Tutorial

Suppose the source text looked like this:

    #include <stdlib.h>

    union urecord_t
    {
      char c;
      short s;
      long l;
    };

    struct record_t
    {
      int type;
    #define RTYPE_CHAR      0
    #define RTYPE_SHORT     1
    #define RTYPE_LONG      2
      urecord_t u;
    };

    bool is_negative(record_t *r)
    {
      switch ( r->type )
      {
        case RTYPE_CHAR:  return r->u.c < 0;
        case RTYPE_SHORT: return r->u.s < 0;
        case RTYPE_LONG:  return r->u.l < 0;
      }
      abort();
    }

We have a disassembly like this:

Let’s improve it with unions. First, let’s define an union type. For this we open the Local types view (menu View|Local types), press Ins to create an union.

We create the union using the “C syntax” tab of the “Add type” dialog:

Switching to the disassembly window, we apply the defined structure through the Edit|Operand types|Struct offset menu item and select the proper representation for the operand. In the union type case, it may be necessary to select the desired union member with the Edit|Structs|Select union member command. The final disassembly looks like this:

That’s all folks !