Il est parfois nécessaire de manipuler des variables auxquelles on désire affecter des valeurs de type différents. Supposons que l'on désire écrire un package mathématique qui manipulera des nombres qui seront implémentés par des int, tant que la précision des entiers de la machine sera suffisante et qui passera automatiquement à une représentation sous forme de flottants dès que ce ne sera plus le cas. Il sera nécessaire de disposer de variables pouvant prendre soit des valeurs entières, soit des valeurs flottantes.
Ceci peut se réaliser en C, grâce au mécanisme des unions. Une définition d'union a la même syntaxe qu'une définition de structure, le mot clé struct étant simplement remplacé par le mot clé union. Exemple :
union nombre { int i; float f; }L'identificateur nombre est appelé étiquette d'union. La différence sémantique entre les struct et les unions est la suivante : alors que pour une variable de type structure tous les membres peuvent avoir en même temps une valeur, une variable de type union ne peut avoir à un instant donné qu'un seul membre ayant une valeur. En reprenant l'exemple précédent, on déclarera une variable n de type union nombre par :
union nombre n;cette variable pourra posséder soit une valeur entière, soit une valeur flottante, mais pas les deux à la fois.