我想知道这样的事情:
int a = ...; long b = ...; if (a < b) doSomethings();
总是有效(除了未签名)
我只是测试了几个值,但我想确定.我认为a
在比较中投入很长时间,其他类型呢?
int/long
比较总是有效.这两个操作数转换为通用类型,在这种情况下long
,所有操作数都int
可以转换为long
没有问题.
int ii = ...; long ll = ...; if (ii < ll) doSomethings();
unsigned/long
比较始终,如果工作long
范围超出unsigned
.如果unsigned
范围为[0...65535]
和long
是[-2G...2G-1]
,则操作数转换为long
和所有unsigned
可被转化为long
,没有任何问题.
unsigned uu16 = ...; long ll32 = ...; if (uu16 < ll32) doSomethings();
unsigned/long
long
范围不超过时比较有问题unsigned
.如果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();
如果type long long
包含所有范围unsigned
,则代码可以使用至少与long long
width 进行比较.
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