In esadecimale 1065353216 è 0x3F800000. Se lo interpreti come numero in virgola mobile a 32 bit, ottieni 1.0. Se si scrive fuori in binario si ottiene questo:
3 F 8 0 0 0 0 0
0011 1111 1000 0000 0000 0000 0000 0000
o raggruppate in modo diverso:
0 01111111 00000000000000000000000
s eeeeeeee vvvvvvvvvvvvvvvvvvvvvvv
Il primo bit (s
) è il bit di segno, i successivi 8 bit (e
) sono l'esponente e gli ultimi 23 bit (v
) sono il significato e. "L'esponente a virgola mobile in virgola mobile a precisione singola viene codificato utilizzando una rappresentazione binaria offset, con l'offset zero pari a 127, noto anche come bias esponenziale nel IEEE 754 standard". Interpretando questo si vede che il segno è 0 (positivo), l'esponente è 0 (01111111 b = 127, lo "spostamento zero"), e il significato è 0. Questo ti dà +0 che è 1.0.
In ogni caso, ciò che sta accadendo è che si sta prendendo un riferimento a un float (b
) e reinterpretandolo come riferimento (int&)
. Quindi quando leggi il valore di j
ottieni i bit da b
. Interpretato come float, questi bit significano 1.0, ma interpretati come int quei bit significano 1065353216.
Per quello che vale, non ho mai usato un cast utilizzando &
come (int&)
. Non mi aspetto di vederlo o usarlo in qualsiasi normale codice C++.
fonte
2009-10-13 16:25:01
Sì, è una grande risposta. Ma ricevo ancora una domanda. Perché un errore, "errore: static_cast non valido dal tipo 'float' per digitare 'int &'", è successo quando ho usato static_cast per lanciare un float su int e mi piace "float b = 1.0f; int & j = static_cast b;". Non ho trovato i limiti di static_cast nel mio libro C++ favoraite, "The C++ Programming Language". –
toby
Questa è la protezione ottenuta dall'uso di cast di stile C++. Se il compilatore accetta una probabilità static_cast, non stai facendo nulla di sbagliato. Le uniche cose non sicure che un cast statico ti consente è una conversione non controllata da Base */Base e Derivata */Derivata e annullata * a T * per quanto posso ricordare. In pratica, è in grado di invertire le conversioni implicite, non di più, senza contare le conversioni const. – sellibitze
Ciao, sellibitze, grazie per il tuo aiuto! Capito! – toby