比较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
范围超出unsigned
则unsigned/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)
如果一个操作数的类型为int
则int
类型的对象总是转换为long
类型long
因为long
类型的排名高于int
类型。
至于其他类型则根据C标准(6.5.8关系运算符)
3如果两个操作数都具有算术类型,则执行通常的算术转换 。
这意味着在整数提升之后,具有较低等级的操作数被转换为另一个操作数的类型。