【问题标题】:Approach for determining max and min values of various types确定各种类型的最大值和最小值的方法
【发布时间】:2017-09-24 19:13:06
【问题描述】:

我想知道我确定这些类型的最大值和最小值的方法是否正确。我在 Google 上四处搜索,找不到确切的方法来确定这一点

这是我的方法: 为了确认我使用的类型的大小 this 链接 现在链接指出int_32_t 的大小(默认情况下是有符号的)在 LP32 中将是16 bits。所以最大 16 位不是65535。但是自从它签署以来,我们将获得最大的65535/2 = 32767.5,所以我假设它的范围将是-32767 to 32767?我对么 ?同样对于uint32_t,LP32 中的大小将是16 bits。所以最大16 位否是65535,所以范围将是0 to 65535?我对么 ?还有LP32ILP32有什么区别我应该关注哪一个?

【问题讨论】:

  • 你写了一个自定义的atoi()函数?是什么让你这样做? :-(
  • 您的链接没有说 int_32_t 将是 16 位。它说“int 是 16 位”。 int_32_tint 不同。

标签: c++11 math numeric


【解决方案1】:

您不必做任何假设。只需使用标准特征:

http://en.cppreference.com/w/cpp/types/numeric_limits

例如:

std::numeric_limits<std::int32_t>::min();
std::numeric_limits<std::int32_t>::max();

解决您的一些观点:

int_32_t(默认已签名)

默认情况下不是,但语言标准强制要求。它是一个有符号整数。未签名的等价物是std::uint32_t

int32_t [...] 将是 16 位

嗯……不。它是有符号整数类型,宽度正好为 32 位,没有填充位,并且对负值使用 2 的补码(仅在实现直接支持该类型时提供)

我假设它的范围是 -32767 到 32767?我对么 ?

没有。对于使用 2 的补码 (std::int16_t) 的 16 位有符号整数,范围是

-32,768 .. 32,767

您可以通过以下方式获得这些数字:

int 类型有 16 位(并且没有填充)。使用 16 位,您可以对 2^16 = 65,536 不同的值进行编码。在二进制补码中,这些值分布如下:

  • [0, 32,767]:32,768 个正值
  • [-32,768, -1]:32,768 个负值

【讨论】:

  • 我明白这一点,但我想知道我的方法在如何确定这些值方面是否正确?
  • 感谢我现在正在尝试消化的答案。顺便说一句,你的意思是 65,536 而不是 65.536
  • @Rajeshwar 对此表示歉意。在我的语言环境中,点 . 用作千位分隔符。我会纠正的。
  • 是的,这是有道理的,感谢您澄清这一点。顺便说一句,出于好奇,哪个语言环境使用点作为分隔符而不是逗号。我发现这是一个有趣的事实。很想知道
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多