#define S64_MIN 如何在 linux 数据类型中定义?

How is #define S64_MIN defined in linux data types?

我试图理解在以下 else 条件中使用的 linux 宏 S64_MIN 的定义,即 draw = S64_MIN.

S64_MIN 此处指的是哪个精确的十进制值?

        if (weights[i]) 
          {
            u = hash(bucket->h.hash, x, ids[i], r);
            u &= 0xffff;
            ln = crush_ln(u) - 0x1000000000000ll;
            
            __s64 draw = div64_s64(ln, weights[i]);
        } 
else   
       {
            __s64 draw = S64_MIN;  
           
          // #define S64_MAX    ((s64)(U64_MAX >> 1))
          // #define S64_MIN    ((s64)(-S64_MAX -1))
       }
        if (i == 0 || draw > high_draw) 
            
          {
            high = i;
            high_draw = draw;
          }
    }
    return bucket->h.items[high];
}

您可以在Linux source code中查找这些宏定义:

#define U64_MAX     ((u64)~0ULL)
#define S64_MAX     ((s64)(U64_MAX >> 1))
#define S64_MIN     ((s64)(-S64_MAX - 1))

这意味着:

  • U64_MAX 将所有位设置为 1。
  • 然后 S64_MAX 将除最高位以外的所有位都设置为 1。
  • 最后,S64_MIN 将只设置最高位。
U64_MAX: 1111 1111 ... 1111 = 0xFFFF FFFF FFFF FFFF = 18,446,744,073,709,551,615
S64_MAX: 0111 1111 ... 1111 = 0x7FFF FFFF FFFF FFFF =  9,223,372,036,854,775,807
S64_MIN: 1000 0000 ... 0000 = 0x8000 0000 0000 0000 = -9,223,372,036,854,775,808

S64_MIN是64位有符号整数所能表示的最小值(最大负值)

#   define S64_MAX  9223372036854775807LL
#   define S64_MIN  (-S64_MAX - 1LL)