Comparing int with long and others

后端 未结 2 897
猫巷女王i
猫巷女王i 2021-01-20 21:00

I am wondering if things like this :

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

if (a < b)
     doSomethings();

always works (excepted for unsigned)

2条回答
  •  渐次进展
    2021-01-20 21:32

    int/long compare always works. The 2 operands are converted to a common type, in this case long and all int can be converted to long with no problems.

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

    unsigned/long compare always works if long ranges exceeds unsigned. If unsigned range was [0...65535] and long was [-2G...2G-1], then the operands are converted to long and all unsigned can be converted to long with no problems.

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

    unsigned/long compare has trouble when long ranges does not exceed unsigned. If unsigned range was [0...4G-1] and long was [-2G...2G-1], then the operands are converted to long, a common type that does not encompass both ranges and problems ensue.

    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();
    

    If type long long includes all the range of unsigned, code could use do the compare with at least 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
    

提交回复
热议问题