左移 (<<) 是 C++11 中负整数未定义行为吗?

2024-02-20

左移是负数吗intC++11 中未定义的行为?

这里的相关标准段落来自 5.8:

2/E1

让我困惑的部分是:

否则,如果 E1 具有有符号类型和非负值,且 E1×2E2 可以用结果类型表示,那么这就是结果值; 否则,行为是未定义的。

这是否应该被解释为左移any负数是UB?或者这仅仅意味着if你 LS 为负数,结果不符合结果类型,then是UB吗?

此外,前款还说:

1/移位运算符 > 从左到右分组。 移位表达式: 加法表达 移位表达式 > 加法表达式

操作数应为整数或无范围枚举类型,并且 进行积分促销。

结果的类型是提升后的左操作数的类型。这 如果右操作数为负或更大,则行为未定义 大于或等于提升的左操作数的位长度。

这明确表明使用负数one操作数中的 UB 为 UB。如果 UB 对另一个操作数使用负数,我希望这里也能清楚地说明这一点。

所以,底线是:

-1 << 1

未定义的行为?


@Angew provided https://stackoverflow.com/a/19594249/241536标准语言的伪代码解释,简洁地表达了一种可能(可能)有效的解释。其他人质疑这个问题是否真的是关于“行为未定义”语言的适用性与我们(StackOverflow)使用的短语“未定义行为”的适用性。此编辑是为了对我想问的问题提供更多澄清。

@Angew 对标准语的解释是:

if (typeof(E1) == unsigned integral)
  value = E1 * 2^E2 % blah blah;
else if (typeof(E1) == signed integral && E1 >= 0 && representable(E1 * 2^E2))
  value = E1 * 2^E2;
else
  value = undefined;

这个问题真正归结为——实际上正确的解释是:

value = E1 left-shift-by (E2)

switch (typeof(E1))
{
case unsigned integral :
  value = E1 * 2^E2 % blah blah;
  break;

case signed integral :
  if (E1 >= 0)
  { 
    if (representable(E1 * 2^E2))
    {
      value = E1 * 2^E2;
    }
    else
    {
      value = undefined;
    }
  }
  break;
}

?

旁注,从伪代码的角度来看,我很清楚@Agnew 的解释是正确的。


是的,我会说它是未定义的。如果我们将标准语言翻译成伪代码:

if (typeof(E1) == unsigned integral)
  value = E1 * 2^E2 % blah blah;
else if (typeof(E1) == signed integral && E1 >= 0 && representable(E1 * 2^E2))
  value = E1 * 2^E2;
else
  value = undefined;

我想说的是,它们明确说明右侧操作数而不是左侧操作数的原因是您引用的段落(右侧操作数大小写的段落)适用于左移和右移。

对于左侧操作数,裁决有所不同。负数左移是未定义的,右移是实现定义的。

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

左移 (<<) 是 C++11 中负整数未定义行为吗? 的相关文章

  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • 使用管道在父级和子级之间传递整数值

    我对如何正确使用 pipeline 在两个进程之间传递整数值有点困惑 在我的程序中 我首先创建一个管道 然后分叉它 我假设我有 两个 管道 据我了解 这是我的任务 我的父母通过 for 循环检查某个操作的整数值 i 增加计数变量 并将值保存
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem

随机推荐

  • IActionFilter 和 IAuthorizationFilter 之间的区别

    我只是想知道两者之间是否有什么区别IActionFilter and IAuthorizationFilter 我假设我们可以在下面实现相同的逻辑IActionFilter可能有IAuthorizationFilter 真的吗 Thanks
  • 从 C++ 中的 std::string 中删除空格

    在 C 中从字符串中删除空格的首选方法是什么 我可以循环遍历所有字符并构建一个新字符串 但有更好的方法吗 最好的办法就是使用算法remove if http en cppreference com w cpp algorithm remov
  • jQuery UI:日期选择器将年份范围下拉设置为 100 年

    使用日期选择器时 年份下拉菜单默认仅显示 10 年 用户必须单击去年才能添加更多年份 我们如何将初始范围设置为 100 年 以便用户默认看到一个大列表 function InitDatePickers datepicker datepick
  • GZipStream 进行 gzip 压缩,但解压缩文件最终会出现“数据意外结束”

    有谁知道为什么我在解压缩 gzip 文件时收到 数据意外结束 错误消息 为了验证字节数据没有损坏 我使用FooTest4 csv写入文件并能够成功打开该文件 两者都是 FooTest3 csv gz and FooTest2 csv gz解
  • 如何忽略 PHP 中未定义的变量错误[重复]

    这个问题在这里已经有答案了 我最近设置了一个新的网络服务器 但遇到了未定义的变量错误 如果我在没有初始化的情况下使用变量 则会出现错误 源代码没有改变 只有 LAMP 环境可以 你会如何解决这个问题 Thanks Well 您应该定义所有变
  • SVG viewBox 反转 Y 坐标

    我正在使用 SVG 在 HTML 页面中绘制不同的形状 这些不同的形状是从 Microsoft Sql Server 中的空间数据库的几何对象中检索的 我面临的问题是坐标系统 Svg 和 Microsoft Sql Server 不同 0
  • 调整highlight.sector() 宽度和位置 - R 中的和弦图(circlize 包)

    我需要一些帮助来调整突出显示的部分chordDiagram 来自 circlize 包 我正在处理渔业上岸数据 渔船从一个港口出发 母港PORT DE 并将他们的捕获物降落在另一个港口 登陆港PORT LA 我正在处理扇贝活重 吨 上岸量S
  • 如何在 vim 中搜索没有前面“\r”的“\n”?

    如果 Vim 看到不一致的行结尾 则不会转换文件格式 我怎样才能找到那些 零宽度后向断言 如何在 vim 中搜索没有前面 r 的 n r
  • JAVA Quartz - 如果上一个作业仍在运行,则跳过作业并等待下一个计划时间

    我有一个 Java 解决方案 使用Quartz 2 2 3 我所拥有的是 我的工作类别已注释 DisallowConcurrentExecution为了避免并发 所以同一个作业不能每次运行一次 OK 它是一个 CRON 每 1 小时运行一次
  • R:使用paste()定义列名

    问题很简单 但我找不到解决方案 我想创建一个新的数据框 定义列的名称paste0 理想情况下 我想做这样的事情 其中一个不起作用 mydataframe lt data frame id 1 paste0 Here my column na
  • 当使用自定义动画的片段替换事务正在运行时暂停活动时出现幽灵行为

    我正在使用片段事务在按下按钮时在组件之间切换 为了使整体体验更好 我添加了自定义动画 将旧片段从左侧动画化 将新片段从右侧动画化 启动此事务的代码如下所示 supportFragmentManager beginTransaction se
  • 如何在 C# 中格式化日期时间,如“Oct. 10, 2008 10:43am CST”

    有没有一种干净的方法将 DateTime 值格式化为 Oct 10 2008 10 43am CST 我需要它带有正确的缩写和小写的 am 或 pm 等 我自己做过 但它很丑 所以我正在寻找不同的方法 Thanks 由于 tt 格式字符串说
  • PHP 绑定文本域失败

    我正在尝试在运行 PHP 7 1 的 CentOS 服务器上设置 PHP 国际化 这是我的目录结构 home project public html locale japanese LC MESSAGES messages po home
  • Django 检查字段是否为空?

    我从数据库中检索了一个对象 该对象有一个外键字段 其属性blank True 我如何检查它是否实际上留空 谢谢您的帮助 blank True只是告诉管理站点该字段可以留空 除非你设置null True同样 如果您尝试输入空白值 您的数据库也
  • 对具有多个条件的列表进行排序 Ruby on Rails

    我希望能够根据 4 个不同的标准对列表中的 12 支球队进行排名 我将有一个名为 Teams 的数据库表 每个团队将有各种列 例如 matches won matches lost 等 我想根据 matches won 按顺序显示它们 这很
  • 你能在 Mongoose 中为子文档定义实例方法吗?

    如果我在 Mongoose 中有一个架构 其定义如下 var subSchema new Schema some String var topSchema new Schema subs subSchema var topModel mon
  • MATLAB 绘图轴所在框中缺少黑线

    在 MATLAB 中绘制图形时 我注意到保存轴的黑盒部分丢失了 左侧和底部 我尝试过发出 box off box on 命令没有成功 你知道我可以做什么来获得轴上相应的黑线吗 Note 我正在使用 OpenGL 渲染器 set 0 Defa
  • Angular 通用元标记在页面源中不可见

    当我查看在我的角度通用项目的构造函数中设置标题和元标记的页面时 标题显示在选项卡中 当我单击 检查元素 并转到时 我可以在 html 中看到元标记和标题到 html 文档的头部 但是 如果您仅单击 查看页面源代码 则不会显示标签 也不会显示
  • 自定义dateutil.parser世纪推理逻辑

    我正在处理具有两位数年份的旧文本文件 其中默认世纪逻辑dateutil parser似乎效果不太好 例如 珍珠港袭击事件并未发生dparser parse 12 7 41 返回 2041 12 7 回滚到 1900 年代的内置世纪 阈值 似
  • 左移 (<<) 是 C++11 中负整数未定义行为吗?

    左移是负数吗intC 11 中未定义的行为 这里的相关标准段落来自 5 8 2 E1 让我困惑的部分是 否则 如果 E1 具有有符号类型和非负值 且 E1 2E2 可以用结果类型表示 那么这就是结果值 否则 行为是未定义的 这是否应该被解释