gpt4 book ai didi

c - gnu-coreutils 源文件中的 TYPE_MINIMUM 常量是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:25 24 4
gpt4 key购买 nike

我正在尝试为一个项目重新实现一些 coreutils,我经常看到 TYPE_MINIMUM(some int),但是我看不到它的定义位置或任何用法。我不确定它是在 make 过程中生成的,还是故意的。有什么想法吗?

我已经包含了函数所需的所有 header ,一切正常,直到调用 TYPE_MINIMUM 进行验证。

正在使用的文件的完整来源:https://github.com/coreutils/coreutils/blob/master/src/who.c

static const char *idle_string (time_t when, time_t boottime)
{
static time_t now = TYPE_MINIMUM (time_t);

if (now == TYPE_MINIMUM (time_t))
time (&now);

if (boottime < when && now - 24 * 60 * 60 < when && when <= now)
{
int seconds_idle = now - when;
if (seconds_idle < 60)
return " . ";
else
{
static char idle_hhmm[IDLESTR_LEN];
/* FIXME-in-2018: see if this assert is still required in order
to suppress gcc's unwarranted -Wformat-length= warning. */
assert (seconds_idle / (60 * 60) < 24);
sprintf (idle_hhmm, "%02d:%02d",
seconds_idle / (60 * 60),
(seconds_idle % (60 * 60)) / 60);
return idle_hhmm;
}
}

return (" old ");
}
error: ‘TYPE_MINIMUM’ was not declared in this scope

最佳答案

可以在 Coreutils "intprops.h" file 中找到该宏的实现。 .

来自那个文件:

/* The maximum and minimum values for the integer type T.  */
#define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
#define TYPE_MAXIMUM(t) \
((t) (! TYPE_SIGNED (t) \
? (t) -1 \
: ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))

其中 TYPE_WIDTH 以位为单位给出类型的大小:

/* The width in bits of the integer type or expression T.
Do not evaluate T.
Padding bits are not supported; this is checked at compile-time below. */
#define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)

它通过取该类型最大值的补码来获得该类型的最小值。它通过以下任一方式获得最大值:

  • 如果它是无符号的,则将值 -1 转换为该类型
  • 如果它是有符号的,则将通过设置第二高位获得的值减一所获得的值加一到两倍。

虽然您的问题并不是真正需要它,但我想仔细检查一下那个已签名的案例。我们以int16_t为例。

如果我们提前处理三元和 TYPE_WIDTH,并忽略额外的括号以确保更安全 TYPE_MAXIMUM(int16_t) 扩展为:

(int16_t) ((((int16_t) (1 << 14)) - 1) * 2 + 1)

然后:

(int16_t) ((((int16_t) 0x4000) - 1) * 2 + 1)

然后:

(int16_t) (((int16_t) 0x3FFF) * 2 + 1)

然后:

(int16_t) ((int16_t) 0x7FFE + 1)

然后:

(int16_t) ((int16_t) 0x7FFE + 1)

这是:

(int16_t) 0x7FFF

TYPE_MAXIMUM 是一种有效设置除高位以外的所有位的方法,而不依赖于有符号溢出,这会产生未定义的行为,不得使用。

TYPE_MAXIMUM 方法确实假定给定的任何带符号类型不使用最大带符号值不由所有但设置的最高位表示的模型。

TYPE_MINIMUM(int16_t) 会将这些位取反以获得 (int16_t) 0x8000

这个来自最大值方法的 TYPE_MINIMUM 假定给定的任何有符号类型不使用符号和大小算术,或者任何其他模型,其中最大持有值的一个补码不是最小值。

有了对符号表示的这两个限制,this table 中给出的表示将与 TYPE_MINIMUM 宏一起使用的是一个补码和两个补码。

在实践中,这可能永远不会成为问题,几乎所有东西都使用有符号整数的二进制补码表示。

关于c - gnu-coreutils 源文件中的 TYPE_MINIMUM 常量是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com