Io generalmente agisco sui singoli bit dei registri, non manipolo quasi mai il registro per intero.
Difatti io disattivo gli interrupt così:
SREG &= ~(1<<SREG_I);
e li riattivo così:
SREG |= (1<<SREG_I);
In questo modo tocco solo il bit degli interrupt globali. Che poi è identico a fare cli() e sei().
Ora, c'è da fare un piccolo ragionamento.
SE, e dico SE, il bit SREG_I degli interrupt globali NON è settato, con il metodo del cli() e sei() io riattivi gli interrupt anche se questi erano disattivati. E forse è questo il motivo per cui viene usato il giochino del rimettere il valore di SREG.
PERO', stiamo lavorando su Arduino, ed il core di Arduino attiva gli interrupt globali SEMPRE perché da essi dipendono componenti fondamentali per il suo funzionamento. Come la seriale. O come delay(). Quindi è un problema che si pone il giusto, se ragioniamo di Arduino. Se invece parliamo di un altro ambiente, allora le cose possono cambiare.