比较int与long和其他

我想知道这样的事情:

int a = ...; long b = ...; if (a < b) doSomethings(); 

总是有效(除了未签名)

我只是测试了几个值,但我想确定。 我认为在比较中投了很长时间,其他类型呢?

int/long比较总是有效。 2个操作数转换为通用类型,在这种情况下为long并且所有int都可以转换为long而没有任何问题。

 int ii = ...; long ll = ...; if (ii < ll) doSomethings(); 

如果long范围超出unsignedunsigned/long compare始终有效。 如果unsigned范围为[0...65535]long[-2G...2G-1] ,则操作数将转换为long并且所有unsigned可以转换为long而没有任何问题。

 unsigned uu16 = ...; long ll32 = ...; if (uu16 < ll32) doSomethings(); 

long不超过unsigned时, unsigned/long比较有问题。 如果unsigned范围为[0...4G-1]long[-2G...2G-1] ,则操作数将转换为long ,这是一种不包含范围和问题的常见类型。

 unsigned uu32 = ...; long ll32 = ...; // problems if (uu32 < ll32) doSomethings(); // corrected solution if (uu32 <= LONG_MAX && uu32 < ll32) doSomethings(); // wrong solution if (ll32 < 0 || uu32 < ll32) doSomethings(); 

如果long long包含所有unsigned范围,则代码可以使用至少long long的比较。

 unsigned uu; long ll; #if LONG_MAX >= UINT_MAX if (uu < ll) #if LLONG_MAX >= UINT_MAX if (uu < ll*1LL) #else if (uu32 <= LONG_MAX && uu32 < ll32) // if (ll < 0 || uu < ll) #endif 

在这种情况下

 if (a < b) 

如果一个操作数的类型为intint类型的对象总是转换为long类型long因为long类型的排名高于int类型。

至于其他类型则根据C标准(6.5.8关系运算符)

3如果两个操作数都具有算术类型,则执行通常的算术转换

这意味着在整数提升之后,具有较低等级的操作数被转换为另一个操作数的类型。