当前位置: 首页 > 知识库问答 >
问题:

按位运算符可以有未定义的行为吗?

齐英朗
2023-03-14

位运算符(~

例如,~运算符在C标准中是这样定义的:

6.5.3.3一元算术运算符

~运算符的结果是其(提升的)操作数的位补码(即,当且仅当转换的操作数中的对应位未设置时,才会设置结果中的每一位)。对操作数执行整数提升,结果具有提升类型。如果升级类型是无符号类型,则表达式~E相当于该类型中可表示的最大值减去E

在所有体系结构上,~0生成一个位模式,符号位设置为1,所有值位设置为1。在一的补码结构上,这种表示对应于负零。这个位模式可以是陷阱表示吗?

对于更常见的体系结构,是否有其他涉及简单按位运算符的未定义行为的示例?


共有1个答案

鲁涵意
2023-03-14

对于补码系统,明确列出了不支持带符号整数中负零的补码系统的陷阱值的可能性(C116.2.6.2p4):

如果实现不支持负零,则

话说回来,一个人的补体系统并不完全常见;例如,GCC不支持任何系统!

C11确实意味着实现定义和未定义的方面只允许用于有符号类型(C116.5p4)。

 类似资料:
  • 问题内容: 我只是试图制作一个简单的类,让我弄清楚文件的长度: 我遇到了一个问题 我得到错误: 未为参数类型定义运算符!= int,null 有什么想法为什么会阻止这种情况吗? 问题答案: Java中的原始类型不能为。如果要检查0,请执行。

  • 问题内容: 为什么按位操作打印-1?在二进制中,不为0应该为1。为什么呢? 问题答案: 你实际上很亲密。 在二进制中,不为0应该为1 是的,当我们谈论一点时,这是绝对正确的。 但是,其值为0实际上是全零的32位!将所有32个零转换为32个零。 这是的补码表示形式。 类似地: 也就是说,对于32位无符号二进制补码表示,。 进一步阅读: 补码 这是Java(以及其他系统)用来表示带符号的数字位的系统

  • 我试图为一个2D表示向量的类定义“-=”和“-”,但我得到了这个错误: vecteur2d.cc:131:7:错误:没有可行的重载“-=”VEC1-=VEC2;

  • 有符号和无符号变量在按位运算上有区别吗?< br >例如,在处理无符号数字时:< br> 将得到00000101。 但当处理带符号的数字时会发生什么?

  • 问题内容: JavaScript中的另一种常见情况是为变量提供预设值(如果未定义),例如: 快捷方式表示法是双竖线字符: 由于某种原因,我无法为我工作。是否真的有可能检查是否定义了v,如果x = 10则不定义? 谢谢。 问题答案: 该Opera文章对正在发生的事情给出了不好的描述。 确实会得到if is 的值。如果具有 任何 “假”值也将是正确的。 __ JavaScript中的“ falsey”

  • 本文向大家介绍JavaScript 按位NOT运算符(〜),包括了JavaScript 按位NOT运算符(〜)的使用技巧和注意事项,需要的朋友参考一下 示例 按位NOT(~)对值中的每个位执行NOT操作。 语法: 返回值: 一个Number。 描述 NOT操作的真值表为: 一种 不是 0 1 1 0 按位不加数字会导致:-(x + 1)。 例子: 值(以10为底) 值(以2为底) 返回(以2为底)