C'è qualche differenza tra il tipo di conversione di tipo & in C++.C'è qualche differenza tra il tipo di casting e la conversione del tipo?
risposta
In generale, la fusione si riferisce ad una conversione esplicita, se è fatto da cast di tipo C (T(v)
o (T)v
) o C++ - ghisa stile (static_cast
, const_cast
, dynamic_cast
o reinterpret_cast
). La conversione è generalmente un termine più generico utilizzato per qualsiasi momento una variabile viene convertito in un altro:
std::string s = "foo"; // Conversion from char[] to char* to std::string
int i = 4.3; // Conversion from float to int
float *f = reinterpret_cast<float*>(&i); // (illegal) conversion from int* to float*
Una delle principali differenze si verifica quando si lavora con le stringhe. Non è possibile pronunciare (int) "234" e ottenere l'intero 234. La trasmissione di tipo generalmente funziona solo su tipi di dati numerici primitivi.
Tipo di fusione significa che si prende una stringa di bit e li interpreta in modo diverso. La conversione del tipo significa che trasformi una stringa di bit da una configurazione utile in un contesto a una configurazione utile in un'altra.
Per esempio, supponiamo che io scrivo
int x=65;
char c=(char) x;
char* s=(char*) x;
c ora contenere il carattere 'A', perché se io reinterpretare il numero decimale 65 come personaggio, ho la lettera 'A'. s ora sarà un puntatore a una stringa di caratteri che si trova nella posizione di memoria 65. Questa è quasi sicuramente una cosa inutile da fare, poiché non ho idea di cosa sia in quella posizione di memoria.
itoa(x, s, 10);
è una conversione di tipo. Questo dovrebbe darmi la stringa "65".
Cioè, con i cast stiamo ancora guardando la stessa locazione di memoria. Stiamo semplicemente interpretando i dati in modo diverso. Con le conversioni stiamo producendo nuovi dati derivati dai vecchi dati, ma non è lo stesso dei vecchi dati.
Quindi stai dicendo, un 'reinterpret_cast' esegue il casting, ma un' static_cast' (nonostante il suo nome) esegue la conversione? Lo troverei molto confuso. – jogojapan
Tipo di fusione può fare un importo minimo di conversione:
signed char Schar; // 1 byte (8 bits) to hold 256 values: -128 to 127
unsigned char Uchar; // 1 byte (8 bits) to hold 256 values: 0 to 255
...
if (Schar < -10 ) ... // compiler uses SIGNED comparision
Uchar = Schar; // implicit conversion only copies the 8 bits
Uchar = (char) Schar; // explicit conversion may be required by compiler
if (Uchar > 200) ... // compiler uses UNSIGNED comparision
...OR...
if ((unsigned char) Schar > 200) ... // explicit conversion for UNSIGNED comparision
short Sshort; // 2 bytes (16 bits) to hold 65536 values: -32768 to 32767
unsigned short Ushort; // 2 bytes (16 bits) to hold 65536 values: 0 to 65536
...
// when moving 8 bits into 16 bit variables, what to do with other 8 bits ?
Sshort = (signed short) Uchar; // move 8 bits over and use 0s for other 8 bits
Sshort = (signed short) Schar; // same, but use 1s if negative to make Sshort negative
Ma questo potrebbe essere considerato Tipo di conversione:
float dbl; // 4 bytes to store floating number in IEEE format
long lng; // 4 bytes to store 32 bit integer value in 2's complement format
...
dbl = lng; // convert from 2's comp to IEEE format - all bits change !
dbl = (float) lng; // explicit form
NOTA: int
di solito è lo stesso di short
o long
a seconda del compilatore/CPU NOTA: signed
è in genere facoltativo poiché questo è spesso il valore predefinito
Nessuna conversione avviene quando si specificano tutte le variabili occupano lo stesso spazio di memoria:
typedef union MYUNION // all members occupy same space (memory bytes)
{
signed char Schar; // usual default for char
unsigned char Uchar;
signed short Sshort; // usual default for short
unsigned short Ushort;
signed long Slong; // usual default for long
unsigned long Ulong;
float flt;
double dbl;
};
MYUNION myunion;
myunion.Schar = ... // set variable (memory byte) to value
if ((unsigned char) myunion.Schar > 200) ... // unsigned compare works ok
... is same as (also without moving any data around) ...
if (myunion.Uchar > 200) ... // unsigned compare works ok
... myunion.Sshort ... // other 8 bits are UNASSIGNED GARBAGE !
myunion.Sshort = myunion.Schar; // provide all 16 bits from Schar
... myunion.Sshort ... // Sshort of valid now
myunion.dbl = 12345.0;
... myunion.Ulong ... // has weird value from odd IEEE bit format
myunion.Ulong = (unsigned long) myunion.dbl; // do explicit conversion
... myunion.Ulong ... // has CONVERTED 12345 value
NOTA: *(unsigned long*)&dbl
produce anche valori strani. Funziona: a) prende indirizzo (posizione dei bit e byte) di double dbl b) considera l'indirizzo come un indirizzo di un unsigned long c) ottiene unsigned long da quella posizione Ovviamente, ci sono alcune applicazioni reali di questa tecnica. Esempi: analisi di un complicato file binario esterno o di CPU con 512 byte di memoria, ecc.
- 1. C'è qualche differenza tra tipo e classe?
- 2. Qual è la differenza tra casting tipo c e casting funzionale?
- 3. C# casting al tipo nullable?
- 4. Differenza tra tipo generico e tipo jolly
- 5. Qual è la differenza tra (tipo) valore e tipo (valore)?
- 6. Qual è la differenza tra il casting long.MaxValue in int e il casting float.MaxValue in int?
- 7. Differenza tra Elm e tipo alias?
- 8. differenza di C# tra casting e come?
- 9. Qualche differenza tra le asserzioni di tipo e il più recente operatore `as` in TypeScript?
- 10. Differenza tra parametri tipo e indici?
- 11. Che cos'è il punto di casting del tipo?
- 12. Differenza tra tipo (obj) e obj .__ class__
- 13. E 'impossibile calcolare la differenza tra il MaxBound e il MinBound di un tipo Enum?
- 14. Qual è la differenza tra un tipo di delegato e un tipo di gestore di eventi?
- 15. Qualsiasi tipo di casting eseguito da javac?
- 16. C'è qualche differenza tra $ @ e "$ @"?
- 17. Qual è la differenza tra un tipo di opzione e un tipo nullable?
- 18. interface {} alla conversione del tipo di funzione
- 19. Il MVVM ViewModel dovrebbe eseguire la conversione/convalida del tipo?
- 20. In Typescript, qual è la differenza tra tipo e interfaccia?
- 21. Esiste una differenza tra il qualificatore di tipo _Atomic e l'identificatore di tipo?
- 22. Qual è la differenza tra un tipo generico e una definizione di tipo generico?
- 23. Qual è la differenza tra tipo e tipo di dati in Haskell?
- 24. Java: qual è la differenza tra autoboxing e casting?
- 25. Conversione tra tipi numerici dello stesso tipo
- 26. Qual è la differenza tra il concetto Callable e i tratti del tipo std :: is_function?
- 27. Qual è la differenza tra boxing/unboxing e type casting?
- 28. Strange numeri Swift tipo casting
- 29. Errore durante la conversione del tipo di dati varchar
- 30. tipo di metodo Java generico casting
quindi non c'è alcuna differenza giusta –
La differenza è che un cast è * esplicito *. Le parole chiave C++ possono essere convertite in grep'ed. Sia il cast di C che quello di C++ mostrano che la conversione è stata fatta di proposito e con il consenso del programmatore.Una conversione implicita potrebbe essere intesa, o per errore. – DevSolar