gpt4 book ai didi

c - 以编程方式确定有符号整数类型的最大值

转载 作者:太空狗 更新时间:2023-10-29 17:02:44 26 4
gpt4 key购买 nike

这个相关问题是关于在编译时确定有符号类型的最大值:

C question: off_t (and other signed integer types) minimum and maximum values

但是,我后来意识到在运行时 确定带符号类型(例如time_toff_t)的最大值似乎是一项非常艰巨的任务。

我能想到的最接近解决方案的是:

uintmax_t x = (uintmax_t)1<<CHAR_BIT*sizeof(type)-2;
while ((type)x<=0) x>>=1;

只要 type 没有填充位,这就避免了任何循环,但如果 type 确实有填充位,则转换调用实现定义的行为,这可能是信号或无意义的实现定义的转换(例如剥离符号位)。

我开始认为这个问题是无法解决的,这有点令人不安,并且在我看来是 C 标准中的一个缺陷。有什么想法可以证明我错了吗?

最佳答案

我们先看看C是如何定义“整数类型”的。取自ISO/IEC 9899 , §6.2.6.2:

6.2.6.2 Integer types
1
For unsigned integer types other than unsigned char, the bits of the object representation shall be divided into two groups: value bits and padding bits (there need not be any of the latter). If there are N value bits, each bit shall represent a different power of 2 between 1 and 2N−1, so that objects of that type shall be capable of representing values from 0 to 2N − 1 using a pure binary representation; this shall be known as the value representation. The values of any padding bits are unspecified.44)
2
For signed integer types, the bits of the object representation shall be divided into three groups: value bits, padding bits, and the sign bit. There need not be any padding bits; there shall be exactly one sign bit. Each bit that is a value bit shall have the same value as the same bit in the object representation of the corresponding unsigned type (if there are M value bits in the signed type and N in the unsigned type, then M ≤ N). If the sign bit is zero, it shall not affect the resulting value. If the sign bit is one, the value shall be modified in one of the following ways:

— the corresponding value with sign bit 0 is negated (sign and magnitude);
— the sign bit has the value −(2N) (two’s complement);
— the sign bit has the value −(2N − 1) (ones’ complement).

Which of these applies is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for ones’ complement), is a trap representation or a normal value. In the case of sign and magnitude and ones’ complement, if this representation is a normal value it is called a negative zero.

因此我们可以得出以下结论:

  • ~(int)0 可能是陷阱表示,即将所有位设置为是一个坏主意
  • int 中可能存在对其值没有影响的填充位
  • 实际表示 2 的幂的位的顺序是未定义的;如果存在,符号位的位置也是如此。

好消息是:

  • 只有一个符号位
  • 只有一个位表示值 1


考虑到这一点,有一种简单的技术可以找到 int 的最大值。找到符号位,然后将其设置为 0,并将所有其他位设置为 1。

我们如何找到符号位?考虑 int n = 1;,它是严格正的并且保证只有一位和可能一些填充位设置为 1。然后对于所有其他位 i,如果 i==0 成立,将其设置为 1 并查看结果值是否为负。如果不是,则将其恢复为 0。否则,我们已找到符号位。

现在我们知道了符号位的位置,我们取int n,将符号位设置为0,将所有其他位设置为1,这样,我们就有了最大可能的 >int 值。

确定 int 最小值 稍微复杂一些,留给读者作为练习。



请注意,C 标准幽默地不需要两个不同的 int 来表现相同。如果我没记错的话,可能有两个不同的 int 对象,例如它们各自的符号位在不同的位置。



编辑: 在与 R.. 讨论这种方法时(请参阅下面的评论),我确信它在几个方面存在缺陷,更一般地说,根本没有解决方案。我看不到修复此帖子的方法(删除它除外),所以我让它保持不变以便下面的评论有意义。

关于c - 以编程方式确定有符号整数类型的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4813055/

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