I compilatori C hanno mai * definito * 'unsigned short x = -3; x * = x;' per produrre qualcosa di diverso da 9

2

In un'implementazione C in cui int può contenere tutti i valori di tipo unsigned short , le regole di promozione di interi standard dettano quello dato il codice:

unsigned short x=(USHORT_MAX+1)-3; // Or just -3
x*=x;

un compilatore dovrebbe valutare quest'ultima affermazione come equivalente a x=(unsigned short)((int)x * (int)x); . Anche se si suppone che i valori non firmati si comportino secondo le regole dell'aritmetica modulare, lo standard non impone alcun requisito sul comportamento di tale affermazione quando x supera sqrt (INT_MAX), e un compilatore può legittimamente specificare un comportamento diverso dal calcolo un risultato come se il calcolo fosse eseguito in modo non firmato nel tipo di destinazione. Ha un'implementazione C storica mai specificata , nei casi in cui il risultato di operatori interi diversi da >> , % e / è forzato a un tipo senza segno inferiore a int , un comportamento contrario a ciò che verrebbe restituito se gli operandi sono stati forzati a, e il calcolo è stato eseguito in, il tipo di destinazione ?

Su una nota correlata, quanti compilatori C "classici" ci sono che, dato un codice come sopra, potrebbero plausibilmente aver fallito nel calcolo 9? Una macchina a complemento a due otterrebbe quel risultato se semplicemente ignorasse qualsiasi overflow nel multiplo, ma una macchina con un segno di grandezza che tentava di eseguire il calcolo usando la matematica con segno intero non poteva. D'altro canto, i compilatori vedono come verrà usata un'espressione nel decidere come valutarla è stata una pratica di lunga data in molti compilatori C, e un compilatore potrebbe facilmente osservare che se l'aritmetica viene eseguita su valori non negativi e il risultato è forzato a unsigned short, lo standard consentirebbe di sostituire i valori non firmati, evitando qualsiasi necessità di logica di gestione dei segni.

    
posta supercat 01.05.2015 - 22:01
fonte

0 risposte

Leggi altre domande sui tag