# 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:

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-1d693d6c5dd97967a8c1a4aea5fbb2c3e5f46042%2FBefore-1.gif?alt=media)

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:

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-6a1c3e75fc10fa7d038d99460b4da3748aabbf87%2FDefineunion.gif?alt=media)

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:

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-312091864859e8840130d7a8754a0a149fb34084%2FAfter.gif?alt=media)

That’s all folks !
