检查一个整数类型的值是否适合另一个整数类型

Type1Type2有两种类型,由不同的头提供,对于某些整数类型都是typedef,但不知道哪些(并且可能在编译器,操作系统等方面有所不同)。 该程序是否保证正常工作(如果它编译)

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

或者是否有我不考虑的角落案件?

如果您只担心条目的大小 ,请使用sizeof

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

不,我认为不幸的是这还不够。 如果例如Type1shortType2int ,则左侧的值仍将提升为int 。 所以你要比较相同类型的相同值。

同时确保两种方式进行比较也无济于事。

您需要做的是确保您以两种方式进行比较, 并且您投射的值是一个值,如果转换为更窄的类型将被截断。 如果两者都是无符号类型,你可以使用类似的东西

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

这也具有编译时表达式的优点。

如果签名中的一个或两个类型,则由于C中允许的不同符号表示,这更加困难。

编辑:当我写这篇文章时,我忽略了你只想在一个方向上。

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

只是告诉你从T1转到T2时是否有信息丢失。