比较int与long和其他

时间:2016-01-02 17:39:36

标签: c int comparison long-integer

我想知道是否有这样的事情:

int a = ...;
long b = ...;

if (a < b)
     doSomethings();

始终有效(除了未签名)

我刚刚测试了几个值,但我想确定。我认为a在比较中被强制转换,其他人类型呢?

2 个答案:

答案 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如果两个操作数都有算术类型,则通常算术   转化次数

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