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

时间:2010-11-10 08:37:13

标签: c types type-conversion

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

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

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

2 个答案:

答案 0 :(得分:3)

如果您只担心条目的尺寸,请使用sizeof

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

答案 1 :(得分:0)

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

同样确保两种方式进行比较通常无济于事。

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

的类型
((T1)-1 == (T1)(T2)(T1)-1) && ((T2)-1 == (T2)(T1)(T2)-1)

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

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

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

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

告诉您从T1投放到T2时是否丢失了信息。