Как #define S64_MIN определяется в типах данных linux? - PullRequest
1 голос
/ 01 августа 2020

Я пытаюсь понять определение linux макроса S64_MIN, используемого в следующем else условии, т.е. 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];
}

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Вы можете найти эти определения макросов в Linux исходном коде :

#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
0 голосов
/ 01 августа 2020

S64_MIN - минимальное значение (максимальное отрицательное значение), которое может быть представлено 64-битным целым числом со знаком.

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