Vérifier qu’une valeur d’un type entier correspond à un autre

Il existe deux types Type1 et Type2 fournis par des en-têtes différents, qui sont tous deux des définitions de type pour certains types entiers, mais on ne sait pas lesquels (et ils peuvent être différents selon les compilateurs, les systèmes d’exploitation, etc.). Est-ce que ce programme est garanti pour fonctionner correctement (s’il comstack)

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

ou y a-t-il des cas où je ne prends pas en compte?

Si vous ne vous inquiétez que de 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"); } 

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

S’assurer également de faire la comparaison dans les deux sens ne serait d’aucune aide en général.

Ce que vous devez faire est de vous assurer que vous faites la comparaison dans les deux sens et que la valeur que vous convertissez est une valeur qui serait tronquée si elle était convertie en un type plus étroit. Si les deux types ne sont pas signés, vous pouvez utiliser quelque chose comme

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

Cela a aussi l’avantage d’être une expression de compilation.

Si l’un des types ou les deux sont signés, cela est beaucoup plus difficile en raison des différentes représentations de signe autorisées en C.

Edit: Lorsque j’ai écrit que j’avais omis de penser que vous ne le vouliez que dans un sens.

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

vous indique simplement s’il y a une perte d’informations lors de la conversion de T1 à T2 .