2010-11-10 8 views
1

Il existe deux types Type1 et Type2 fournis par différents en-têtes, qui sont tous les deux typedefs pour certains types d'entiers, mais on ne sait pas lequel (et peut être différent entre les compilateurs, les systèmes d'exploitation , etc. de toute façon). Est-ce programme garanti pour fonctionner correctement (si elle compile)Vérification qu'une valeur d'un type entier correspond à une autre

Type1 a = ...; 
if (a == (Type2) a) { 
    printf("a fits into Type2"); 
else { 
    printf("a doesn't fit into Type2"); 
} 

ou y at-il des cas de coin, je ne prends pas en compte?

Répondre

3

Si vous êtes seulement préoccupés par la taille de l'entrée, utilisez sizeof:

if (sizeof(a) == sizeof(Type2)) { 
    printf("a fits into Type2"); 
else { 
    printf("a doesn't fit into Type2"); 
} 
+1

Oui, et utilisez une affirmation de compilation pour vérifier cela. – sharptooth

+0

Non, pas la taille. Je veux savoir si la valeur peut être représentée correctement. Par exemple. '4294967295' s'intègre dans' unsigned int' ou 'long long' mais ne rentre pas dans' int' sur une plateforme 32 bits. –

+0

Bien sûr, cela signifie également que cela ne peut pas être décidé au moment de la compilation car il dépend de la valeur réelle de 'a'. –

0

Non, je pense que, malheureusement, cela ne suffit pas. Si par exemple Type1 est short et Type2 est int la valeur sur la gauche serait encore promu à int. Donc, vous comparez la même valeur du même type.

En faisant en sorte de faire la comparaison des deux façons n'aiderait pas en général. Ce que vous devez faire est de vous assurer que vous faites la comparaison des deux côtés et que la valeur que vous avez cast est une valeur qui serait tronquée si elle était convertie en un type plus étroit. Si les deux sont des types non signés, vous pouvez utiliser quelque chose comme

((T1)-1 == (T1)(T2)(T1)-1) && ((T2)-1 == (T2)(T1)(T2)-1) 

Cela a également l'avantage d'être une expression de compilation.

Si l'un ou les deux types sont signés, cela est beaucoup plus difficile en raison des différentes représentations des signes qui sont autorisés dans C.

Edit: Quand j'ai écrit que je négligé en quelque sorte que vous ne vouliez que dans une direction.

(T1)-1 == (T1)(T2)(T1)-1 

vous indique juste en cas de perte d'informations lors de la coulée T1-T2.

+0

"Si par exemple" Type1 "est" court "et" Type2 "est" int ", la valeur sur la gauche serait encore promue en" int ", donc vous comparez la même valeur du même type." Mais n'importe quelle valeur 'short' peut être représentée par' int', donc cela me donne le résultat désiré. –

+0

Voir aussi mon commentaire à la réponse de Nathan; le résultat dépend beaucoup de la valeur réelle de 'a', donc il ne peut pas être trouvé au moment de la compilation. –

+0

@Alexey, c'était juste un exemple. Si vous inversez le rôle de 'int' et' short', vous ne partez pas aussi facilement. Soyez également prudent car votre solution dépend également de la valeur initiale de 'a'. –

Questions connexes