#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 数据类型中是如何定义的?的主要内容,如果未能解决你的问题,请参考以下文章
32位系统调用表入口点如何映射到x86_64中的SYSCALL_DEFINE