(Questo è diverso il comportamento in caso di overflow di un operatore aritmetico. Ad esempio:
int overflow = INT_MAX + 1;
in realtà ha comportamento indefinito Ma in entrambi i casi, si deve fare attenzione a scrivere il codice in modo che doesn. innescano questo tipo di problema)
Per molte implementazioni, sia per la conversione che per l'aritmetica, un overflow in cui il target è un tipo N-bit prende semplicemente N bit di basso ordine del risultato corretto.
Nel tuo caso, apparentemente int
è di 32 bit e short
è di 16 bit (quelle dimensioni possono variare su diverse implementazioni). 2147483647
è 0x7fffffff
, i 16 bit di basso ordine sono 0xffff
, che è (ancora una volta sulla tua implementazione) la rappresentazione di -1
nel tipo short
.
Per la conversione in tipi senza segno, il risultato è rigorosamente definito dallo standard; prende i bit N di basso ordine del risultato. E per il traboccamento della conversione in virgola mobile (ad esempio, la conversione di un valore molto grande double
in float
), il comportamento non è definito.
Finora, questo è lo stesso per C e C++. Ma solo per aggiungere confusione, a partire dallo standard del 1999 una conversione firmata straripante è consentita per innalzare un segnale definito dall'implementazione. Il C++ non ha questo. Non conosco alcun compilatore che lo faccia effettivamente.
mi aspetto di vedere un certo valore e non -1
.
-1
è "un certo valore". C'era qualche valore specifico che ti aspettavi?
Per inciso:
short b = (short)a;
Il cast non è necessaria. Assegnazione, inizializzazione, passaggio parametri e istruzioni return
possono assegnare valori tra qualsiasi tipo numerico senza cast. Il valore viene convertito implicitamente:
short b = a;
Direi che il valore non si adatta, quindi i risultati non sono definiti. –
'-1' * è *" qualche valore ". E il cast '(breve)' non è necessario; la conversione verrà eseguita implicitamente: 'short b = a;' –
@BartFriederichs: il risultato della conversione è * definito dall'implementazione *, non indefinito. –