【问题标题】:The Maximum Value of Signed Integer Types有符号整数类型的最大值
【发布时间】:2023-04-02 14:21:02
【问题描述】:

有符号整数类型的最大整数值是否保证为
(uintmax_t)pow(2, sizeof(TYPE) * CHAR_BIT - 1) - 1
在 C 和 C++ 中?

【问题讨论】:

  • 我不确定这是否能回答您的基本问题,但 C++ 中任何数字类型 T 的最大值为 std::numeric_limits<T>::max()
  • @cdhowie 我正处于一种情况,我需要知道有符号整数是如何在两种语言中兼容的。现在仅仅知道最大值并没有帮助。
  • 目的是什么?也许如果您改为问 那个 问题,我们可能会更有帮助。 (这个问题闻起来像the XY problem。)
  • @xiver77 也许您需要问第二个问题才能准确了解您需要知道的内容。
  • 好吧,由于我的问题中的陈述似乎是错误的,我需要以某种方式找到另一条路线。实际上就是这样。

标签: c++ c integer signed


【解决方案1】:

没有。

整数类型允许有填充位,它们对值没有贡献。例如,具有 8 个填充位的 32 位有符号整数类型的最大值为 223-1,或 16777215,而不是 231-1 ,或2147483647

这在 C 标准中明确说明。我在 C++ 标准中没有找到类似的措辞,但我认为 C++ 也允许整数类型具有填充位。

但很少有编译器会利用此权限。

要确定整数类型的最大值,请使用<limits.h> 中定义的适当*_MAX 宏,或在C++ 中使用std::numeric_limits<T>::max(),如cdhowie 的评论所建议的那样。

(顺便说一句,pow 函数并不是表示您所询问的值的最佳方式。它是一个浮点函数,在某些情况下其结果可能不准确。)

【讨论】:

  • 我还有一个问题!如果这是有符号整数类型的最大值值,我的陈述是否正确?
  • @xiver77:我不明白你的意思。如果您询问最广泛支持的整数类型,则允许有填充位,至少在 C 中是这样。
  • @xiver77:至少在 C 中,有符号整数类型是对称的,除了可选的额外负值。填充位未指定。填充位的值不会影响该值,但可能会创建陷阱表示。 (实际上,除了没有填充位的 2 补码之外,您非常不太可能找到任何东西。)
  • @MSalters:是的,它是由实现定义的,通常最负值(对于 2 的补码)或 -0(对于 1 的补码和符号和幅度)是陷阱表示与否。在没有填充位的情况下,这些是唯一可能的陷阱表示。绝大多数现代系统使用 2 的补码,没有陷阱表示和填充位(因此有符号整数的范围不对称)。即使标准允许,其他任何东西都会非常奇特。
【解决方案2】:

这取决于您所说的“最大整数值”是什么意思。

如果您问是否保证特定实现将支持该最大值,答案是否定的。

但如果您要问是否保证没有任何实现可以超过该最大值,答案是肯定的。

有符号整数中的正值最多可以有 n-1 个值位,其中 n 是数据类型中的位数。所以 2 n-1-1n 位的有符号整数的最大可能值。

没有实现可以有更高的最大值,但它们可以有更低的最大值。

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2011-06-18
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多