我想知道是否有这样的事情:
int a = ...;
long b = ...;
if (a < b)
doSomethings();
始终有效(除了未签名)
我刚刚测试了几个值,但我想确定。我认为a
在比较中被强制转换,其他人类型呢?
答案 0 :(得分:6)
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
都可以转换为{{ 1}}没有问题。
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();
包含long long
的所有范围,则代码可以使用至少unsigned
宽度进行比较。
long long
答案 1 :(得分:3)
在这种情况下
if (a < b)
int
类型的对象始终转换为类型long
,前提是其中一个操作数的类型为long
,因为类型long
的排名高于类型int
1}}。
对于其他类型,然后根据C标准(6.5.8关系运算符)
3如果两个操作数都有算术类型,则通常算术 转化次数。
这意味着在整数提升之后,具有较低等级的操作数被转换为另一个操作数的类型。