però siccome non si tratta di uCosì come per strcat ho avuto difficoltà a atrovare in giro per la rete qualche cosa di utile che mi spiegasse cosa facesse in concreto una union. Ecco il mio codice di esempio;
#include <stdio.h>
#include <stdlib.h>typedef union _c
{
char byte[4];
int prova;
} c;
int main (void)
{
c prova;
prova.prova = 127;
printf(“%d”, prova.byte[0]);
return 0;
}
Come dovreste sapere (se siete interessati al C ovvio) un char occupa un byte mentre un int ne occupa 4. Se avessi usato una struttura, la struttura avrebbe occupato 4 + 1 = 5 byte in memoria. Con la union vengono occupati max(1,4) = 4 byte in memoria, ovvero il numero di byte pari alla dimensione occupata dalla variabile più grande.
La parte interessante, che si vede in questo esempio, è che se io scrivo la variabile intera della union, e poi vado a leggere “byte” nella prima posizione, allora troverò il valore 127. Ho fatto diversi esperimenti e per esempio ho inserito 128. Il valore stampato a video ovviamente è -128:
128 = 10000000 e l’1 davanti alla sequenza di bit indica che si tratta di un numero negativo.
Ho provato a modificare il codice impostando la union così:
typedef union _c
{
char byte[4];
unsigned int prova;
} c;
Mi aspettavo che quel 128, una volta stampato risultasse ancora positivo ed invece rimaneva negativo. Quindi ho provato con:
typedef union _c
{
unsigned char byte[4];
int prova;
} c;
… e questa volta il programma ha stampato 128. Ad essere sincero non credevo che i char potessero essere unsigned =). Un “carattere senza segno”. “a” e “-a” sono due cose ben diverse =). Del resto a volte 127 + 1 = -128. Sperto che questo post risolva i problemi di qualche sventurato che continua a non capire come mai le cose non vanno mai come devono andare.