int32_t x = (int32_t)y;
non è troppo pieno e non UB. Overflow è quando un'operazione aritmetica produce un risultato al di fuori dell'intervallo di valori rappresentabili. Tuttavia, una conversione non è un'operazione aritmetica.
Questa situazione è comportamento definito dall'implementazione. Tutte le implementazioni di cui sono a conoscenza definiscono il comportamento come non apportare alcun cambiamento nella rappresentazione.
Si noti che non è necessario eseguire il cast qui. Puoi scrivere int32_t x = y;
. In termini pratici, questo è più semplice e funzionerà sempre. Così tanto codice si basa su questo che nessun venditore definirà mai nessun altro comportamento (non che abbia comunque ragione di farlo).
int32_t x = *(int32_t*)&y
non è UB. Non viola l'aliasing rigoroso perché la versione firmata di un tipo è autorizzata ad aliasare la versione senza firma. Questo codice è garantito per produrre il int32_t
con la stessa rappresentazione del corrispondente uint32_t
(ad esempio "involucro", poiché questi tipi sono garantiti come complemento a 2).
fonte
2016-04-18 22:13:54
Non è teoricamente impossibile convertirlo senza rischio di overflow? – pingul
Cosa dovrebbe fare quando si verifica un overflow? Completa il complemento a due (che è il "comportamento indefinito" che in realtà diventa il 99% di tutti i compilatori/CPU del mondo)? – ShadowRanger
Presumo che 'y' sia dichiarato come' uint32_t y; '(sarebbe opportuno aggiungerlo alla domanda) –