2017-10-11 3 views
-1

J'essaie de comprendre ce qui se passe sous le capot de c conversions, et différents types de promotions et de comparer des choses et tout cela.Conversions arithmétiques habituelles et promotion d'entier

union myUnion{ 
int intVal; 
float floatVal;}; 

if (m.floatVal == m.intVal) 
{ 
    cout << "BINGO!"; 
} 


if (*ptrInt == *ptrInt2) 
{ 
    cout << "BINGO!" << endl << *ptrInt << endl << *ptrInt2; 
} 

La première instruction if est évaluée à false et la seconde if à la valeur true.

Comment c compilateur interprète ces valeurs m.floatVal, m.intVal. Je veux dire ce qui se passe là-bas, dans l'assemblage, parce que ça va tourner sur le CPU.

De plus, m.floatVal, m.intVal est évalué en fonction de la variable que j'ai initialisée en premier.

m.floatVal = 3; obtient d'abord quelque chose m.intVal = 3; d'abord obtient quelque chose d'autre.

Au final, il y a la même valeur ici!?!?!?!?!?!?

Deuxième exemple:

char minstogo = 0x98; 
if (minstogo <= 7) { 
    cout << "BEAST!"; 
} beast is printed 

char minstogo = 0x98; 
if ((unsigned char)minstogo <= 7) { 
    cout << "BEAST!"; 
} nothing is printed 

char minstogo = 0x98; 
if (minstogo <= (unsigned char)7) { 
    cout << "BEAST!"; 
} beast is printed 

Comment le compilateur interprète ce gâchis et ce qui se passe en bas de l'ensemble?

Troisième exemple: Comment un flottant est-il converti en int? Qui les bits sont tous remappés?

Merci beaucoup les gars! Je vous remercie.

+0

votre compréhension de l'union est fausse: il n'y a pas de conversion du tout. Consultez ce lien: https://www.tutorialspoint.com/cprogramming/c_unions.htm –

+0

techniquement (selon la norme) 'if (m.floatVal == m.intVal)' invoque un comportement non défini * car un seul les membres d'un 'union' peuvent être actifs à la fois (en pratique, la plupart des compilateurs les traiteront comme 'union' en C) – UnholySheep

+0

Vous continuez à dire C quand vous avez étiqueté C++. Est-ce que vous posez des questions sur le C++ comme le suggère votre code, ou demandez-vous vraiment sur C? –

Répondre

2

Premier exemple:

union myUnion{ 
int intVal; 
float floatVal;}; 

if (m.floatVal == m.intVal) 
{ 
    cout << "BINGO!"; 
} 

Ce comportement est indéfini en C++. Ayant écrit à intVal, la lecture floatVal est un comportement indéfini. Ayant écrit à floatVal, la lecture intVal est un comportement indéfini.