【问题标题】:How to check whether an int variable contains a legal (not trap representation) value?如何检查 int 变量是否包含合法(不是陷阱表示)值?
【发布时间】:2020-04-24 16:08:43
【问题描述】:

上下文:

这主要是对that other question的跟进。 OP 想猜测一个变量是否包含一个 int,我的第一个想法是在 C 中(如在 C++ 中)一个 int 变量只能包含一个 int 值。 Eric Postpischil 提醒我,对于 int 类型,每个标准都允许 trap 表示...

当然,我知道大多数现代系统只使用整数的 2 补码表示,没有填充位,这意味着无法观察到陷阱表示。尽管如此,这两个标准似乎仍然允许有符号类型的 3 种表示形式:符号和幅度、一个补码和二进制补码。并且至少 C18 草案(n2310 6.2.6 类型表示)明确允许除 char 以外的整数类型的填充位。

问题

因此,在可能的填充位或非二进制补码符号表示的上下文中,int 变量可能包含符合实现的陷阱值。是否有可靠的方法来确保 int 变量包含有效值?

【问题讨论】:

  • 我知道C和C++是不同的语言,有不同的标准参考文档。但在这里,我会对两者及其可能的差异感兴趣。如果差异太重要或者可能会弄乱答案,我可以专门针对其中一个问题提出这个问题,然后针对另一种语言提出不同的问题。
  • 如果可以观察到,那也不算陷阱。或者至少将其称为陷阱是正确
  • 您可以随时将memcpy intchar[sizeof int],然后对位值进行特定于平台的检查...

标签: c++ integer language-lawyer data-representation bit-representation


【解决方案1】:

在 C++ 当前的工作草案(针对 C++20)中,整数不能有陷阱表示。整数被强制作为二进制补码:([basic.fundamental]/3)

无符号整数类型与对应的有符号整数类型具有相同的对象表示、值表示和对齐要求 ([basic.align])。 对于有符号整数类型的每个值 x,与 x 模 2N 一致的相应无符号整数类型的值在其值表示中具有相同的相应位值。 41 [ 示例:有符号整数类型的值 -1 与相应无符号类型的最大值具有相同的表示。 — 结束示例 ]

注释 41 所说的地方

这也称为二进制补码表示。

这已在 p0907 中更改。

此外,整数中的填充位不会导致陷阱:([basic.fundamental/4])

对象表示中任何填充位([basic.types])的每组值都是由值表示指定的值的替代表示。 [ 注意:填充位具有未指定的值,但不会导致陷阱。 另见 ISO C 6.2.6.2。 ——尾注 ]

【讨论】:

  • 谢谢!我找不到 C++20 草案的参考。你知道公开的 pdf 版本吗?
  • 我通常在eel.is/c++draft 浏览在线版本,它包括可导航的链接,并且是最新的TeX 文件。您可以在wg21.link/std 找到最新发布的工作草案。 (事实上​​,wg21.link 通常只是一个有用的链接,可以访问论文和东西。)
  • @SergeBallesta:Working Draf
猜你喜欢
  • 2016-05-27
  • 2018-06-29
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2022-11-04
相关资源
最近更新 更多