2016-11-01 7 views
-4

Si je fais cette missiondéréférencement d'un pointeur aliasé d'une autre d'un type incompatible

float x = 16.8; 
unsigned int i = *(unsigned int*) &x; 

Quelle sera la valeur de la i variable? Qu'est-ce que c'est la logique de cette mission?

+0

Comportement indéfini, règle d'alias stricte. –

+0

c'est un entier donc pas de point décimal. Aussi pourquoi ne pas le tester dans un compilateur simplement? Va conduire à UB – amanuel2

+0

Vous devriez utiliser une union, apparemment, sinon le comportement sera indéfini. Voir [ici] (http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule) pour plus d'informations. –

Répondre

1

Avec un code comme celui-ci, vous auriez pu voir la réponse dans votre cas précis:

#include <stdio.h> 

int main(void) 
{  
    float x = 1; 
    unsigned int i = *(unsigned int*) &x; 
    printf("%d\n", i); 

    return 0; 
} 

Ce type d'affectation est illégale, en jetant un pointeur vers une float en un pointeur sur un unsigned int, puis de le déréférencer, vous êtes contre le Strict Aliasing Rule.

Comme il a été dit dans les commentaires, il n'y a pas de réponse stricte. Même si avec un arrondi x comme:

float x = 16; 

Vous aurez probablement pas un i = 16 prévu.

Dans la plupart des cas, votre code semblera correct, vous ne serez pas prévenu ou quoi que ce soit et votre code sera exécuté. Alors faites attention!