将int所有字节设置为(unsigned char)0,保证代表零?

2023-12-23

This is not a matter of recommended practise (nor undefined behavior), but about what the c++-standard actually guarantees in the matter of turning all bytes of an integer type to the value of (unsigned char)0.


问题

在下面的代码片段中,是使用的表达式if 语句保证被评估为true in c++11 /questions/tagged/c%2b%2b11?

std::memset (
  reinterpret_cast<char*> (&a), // int a;
  (unsigned char)0,
  sizeof (int)
);

if (a == 0) {
  ...
}

通过阅读 C99 和 C++11 标准的引用(在这篇文章的后面),我们发现 C99 明确地保证所有位设置为的整数类型0将代表值0在那种类型中。

我在 C++11 标准中找不到这种保证。

  • 难道就没有这样的保证吗?
  • 前面的代码片段的结果真的是特定于实现的吗?


在 C99 中(ISO/IEC 9899:1999)

5.2.1.2/1 多字节字符

所有位为零的字节应被解释为空字符 独立于移位状态。这样的字节不得作为任何字节的一部分出现 其他多字节字符。

6.2.6.2/1 整数类型

The values of any padding bits are unspecified.45) A valid (non-trap) object representation of a signed integer type where the sign bit is zero is a valid object representation of the corresponding unsigned type, and shall represent the same value.

对于任意整数 类型,所有位都为零的对象表示应为 该类型中值零的表示。



在 C++11 中(ISO/IEC 14882:2011)

2.3/3     字符集     [lex.charset]

基本执行字符集和基本执行 宽字符集应包含基本字符集的所有成员 源字符集,加上表示警报的控制字符, 退格键和回车符,加上空字符(分别, 空宽字符),其表示全部为零位.


C++ 11

我认为相关的部分是

C++11 中的 3.9.1/1

对于字符类型,对象表示的所有位都参与 在值表示中。对于无符号字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。

与 3.9.1/7 一起

整数类型的表示 应使用纯二进制计数系统定义值。

C11

6.2.6.2 非常明确

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.

对于有符号整数类型,对象表示的位应分为三部分 组:值位、填充位和符号位。不需要任何填充位; signed char 不应有任何填充位。必须只有一个符号位。 作为值位的每个位应与对象中的相同位具有相同的值 相应无符号类型的表示(如果有符号中有 M 个值位) 类型和 N 为无符号类型,则 M ≤ N)。如果符号位为零,则不会影响结果值。如果符号位为 1,则应在其中之一修改该值 以下方式:

— 符号位为 0 的对应值取反(符号和大小);

— the sign bit has the value −(2M) (two’s complement);

— the sign bit has the value −(2M − 1) (ones’ complement).

其中哪一个适用是实现定义的,符号位 1 的值是否适用也是由实现定义的 并且所有值位为零(对于前两个),或者符号位和所有值位为 1(对于补码),是陷阱表示或正常值。在符号和的情况下 大小和补码,如果该表示是正常值,则称为 负零。

Summmary

我认为这两个标准的意图是相同的。

  • char, signed char and unsigned char让所有位都参与该值

  • 其他整数类型可能有填充位不参与该值。其中错误的位模式可能意味着无效值。

  • 解释是纯二进制表示,其定义在上面的 C11 引用中得到了扩展。

有两点可能不太清楚:

  • 可以-0(对于符号和大小和 _ones 的补码)是 C++ 中的陷阱值

  • 填充位之一可以是奇偶校验位(即,如果我们确保填充位不被修改,我们是否可以修改表示形式)

我会保守一点,假设两者都是肯定的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将int所有字节设置为(unsigned char)0,保证代表零? 的相关文章

  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • LINQ to XML - 如何正确使用 XDocument

    现在我首先要说的是 这确实是一项任务 然而 在我遇到 Linq to XML 语法之前 我几乎已经完成了它 我有 2 个课程 曲目和 CD 现在作为作业的一部分 我创建了一张 CD 然后向其中添加了一些曲目 在搜索了大量完美解释了如何从 x
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • 阅读 Stack Overflow RSS 源

    我正在尝试获取未回答问题的列表the feed https stackoverflow com feeds 但我在阅读时遇到困难 const string RECENT QUESTIONS https stackoverflow com f
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐