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

Posted

技术标签:

【中文标题】#define S64_MIN 在 linux 数据类型中是如何定义的?【英文标题】:How is #define S64_MIN defined in linux data types? 【发布时间】:2020-08-01 15:07:50 【问题描述】:

我正在尝试理解以下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];

【问题讨论】:

是什么让你不能只打印它们? 【参考方案1】:

您可以在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

【讨论】:

谢谢!所以基本上这里的十进制值就等于9,223,372,036,854,775,808吧? U64_MIN 为 0。绝对不是全 1。 @0andriy 感谢您的提示。它是U64_MAX,如代码 sn-p 所示。修正了错字。【参考方案2】:

S64_MIN 是可以用有符号的 64 位整数表示的最小值(最大负值)。

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

【讨论】:

以上是关于#define S64_MIN 在 linux 数据类型中是如何定义的?的主要内容,如果未能解决你的问题,请参考以下文章

linux下查看机器配置

32位系统调用表入口点如何映射到x86_64中的SYSCALL_DEFINE

SP34096 DIVCNTK - Counting Divisors (general) min_25筛

如何在 VC++ 中使用 _W64 和 __w64?

linux c 宏定义

14 Linux平台设备应用---beep