2012-06-08 15 views
11

Supponiamo che ci siano due numeri interi (int x, y;).
x è negativo e y = 0x80000000.Sottrazione senza overflow?

Perché (x - y) non ha overflow mentre x + (-y) fa?
Il computer non sottrazione per aggiunta?

+0

Come fai a saperlo? – lindelof

+0

"Sistemi informatici, Prospettiva di un programmatore" Soluzione al problema 2.32 (pagina 87) "... avremo anche -y uguale a TMin, quindi la funzione tadd_ok considererà l'overflow negativo ogni volta che x è negativo. Infatti, xy non trabocca per questi casi ... " – Yuu

risposta

8

Per rispondere alla prima domanda, 0x80000000 (-2,147,483,648) rappresenta il valore minimo a 32 bit per gli interi con segno. 2.147.483.647 è il valore massimo. La grandezza del valore massimo è inferiore alla grandezza del valore minimo se memorizzato usando Two's Complement. Non è possibile rappresentare solo (-y) in quanto supera il valore massimo (di 1). Il valore intero finale di (x-y) è compreso nell'intervallo (dato che x è negativo) e può essere rappresentato da un numero intero a 32 bit.

Per rispondere alla seconda domanda, la sottrazione si ottiene convertendo il numero da sottrarre nel suo additivo inverso. Dato il potenziale di overflow in questa situazione, il compilatore può ottenere il risultato corretto per (x-y) facendo -((-x)+y). Tuttavia, questa è pura speculazione (è l'unico modo in cui posso pensare di farlo in sicurezza).

Problemi correlati