编译器是否优化了净零位移?

2024-04-20

我有一些代码,如下面的代码块(我不允许发布原始代码).cpp我认为正在编译的文件clang++ (Ubuntu clang version 3.5.2-3ubuntu1 (tags/RELEASE_352/final) (based on LLVM 3.5.2)).
看起来像C代码,因为我们正在使用GoogleTest用于测试我们的C代码。无论如何:

size_t const SHIFT = 4;
uint8_t var, var2;
/* Omitted: Code that sets var to, say 00011000 (base 2) */
var2 = var;
var = var << SHIFT >> SHIFT; // [1] result is 00011000 (base 2) (tested with printf)
var2 = var2 << SHIFT;
var2 = var2 >> SHIFT; // [2] result is 00001000 (base 2) (tested with printf)

现在,为什么评论[1]正确吗?我假设相应的行会导致前 4 位被清零。但我发现这不是真的;该程序只是恢复原始值。

这是某种语言定义的行为,还是clang编译出一个据称无用的位移位?

(我检查了关联性(使用cppreference.com 上的此表 http://en.cppreference.com/w/c/language/operator_precedence,假设基本运算符的结合性/优先级在不同版本之间没有差异C++并且可能不在之间C++ and C要么,至少不是在“当前版本”中),并且看起来像 RHS 表达式[1]实际上应该产生与以下两个语句相同的结果)


你所看到的结果是整数促销。任何等级低于类型的值int,当在表达式中使用时,被提升为int.

这在第 6.3.1.1 节中有详细介绍。C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

2无论何时,都可以在表达式中使用以下内容int or unsigned int可能 使用:

  • 具有整数类型的对象或表达式(除了int or unsigned int) 其整数转换等级小于或等于int and unsigned int.
  • 类型的位域_Bool, int, signed int, or unsigned int.

If an int可以表示原始类型的所有值(受宽度限制,对于 位域),该值被转换为int;否则,它会被转换为unsigned int。这些被称为整数促销。所有其他类型均未改变 整数促销。

在这种情况下:

var = var << SHIFT >> SHIFT;

var首先晋升为int。该类型至少为 16 位宽,最有可能为 32 位宽。所以正在操作的值是0x00000018。左移 4 的结果是0x00000180,随后右移导致0x00000018.

然后结果存储在uint_8。由于该值适合这种类型的变量,因此不需要转换0x18被储存了。

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

编译器是否优化了净零位移? 的相关文章

  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • C# 中的简单获取字符串(忽略末尾的数字)

    我认为正则表达式太过杀伤力 而且它需要我一些时间来编写一些代码 我想我现在应该学习 因为我知道一些正则表达式 分隔字母数字字符串中的字符串的最简单方法是什么 它将永远是 LLLLDDDDD 我只想要字母 l 通常只有 1 或 2 个字母 T
  • return 语句是否为按值返回的函数创建临时对象?

    当我学习 C 11 右值引用和移动语义时 我开始对函数如何返回值来初始化变量感到困惑 看下面的例子 Widget makeWidget Widget w return w Widget w1 makeWidget 这里我假设没有 RVO 即
  • 是否有一种快速替代方法可以从 XNA 中的位图对象创建 Texture2D?

    我环顾四周 发现从位图创建Texture2D的唯一方法是 using MemoryStream s new MemoryStream bmp Save s System Drawing Imaging ImageFormat Png s S
  • Lambda、封闭变量、显示类、可序列化性和流行层

    我已经为 Compact Framework 实现了一个流行层 包括BinaryFormatter 类似序列化器 我希望能够在适当的情况下序列化编译器生成的类 这些类是由 lambda 和迭代器等产生的 这样如果 例如 lambda 及其封
  • 如何让我的方法等待所有线程完成?

    我有一个方法可以触发线程来完成一些工作 将有 2 个线程异步运行一段时间 当调用它们的回调方法时 回调会触发另一个线程 直到所有工作完成 如何让我的方法等待所有这些线程完成并被触发 如果这是 Net 4 0 您可以使用CountdownEv
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • 委托:方法名称预期错误

    我正在尝试让以下简单的委托示例正常工作 根据我从中取出的一本书 应该没问题 但我得到了Method name expected error namespace TestConsoleApp class Program private del
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • 为什么这是一个未定义的行为?

    我的回答这个问题 https stackoverflow com q 18706587 845092这个函数是 inline bool divisible15 unsigned int x 286331153 2 32 1 15 40086
  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • 如何将 typedef 结构传递给函数?

    此刻我正在努力 void avg everything 但这给了我错误 error subscripted value is neither array nor pointer 当我今天早些时候收到此错误时 这是 因为我没有正确地将 2D
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 有C语言的解释器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca
  • 如何为单个函数设置 ICC 属性“fp-model precision”,以防止关联优化?

    我正在实施卡汉求和 http en wikipedia org wiki Kahan summation algorithm 在支持 gcc47 gcc48 clang33 icc13 和 icc14 编译的项目中 作为该算法的一部分 我想
  • XslCompiledTransform 和自定义 XmlUrlResolver:“具有相同键的条目已存在”

    有没有办法调试由自定义 XmlUrlResolver 从数据库加载的 XSLT 文档 或者有人知道下面的错误消息是关于什么的吗 我有一个导入通用 xslt 文档的 XSLT 样式表

随机推荐

  • OCaml:用消息断言

    又是另一个问题 P 我不太确定是否应该将其发布在这里或 OCaml 邮件列表上 但我首先尝试这样做 我喜欢断言语句 然而 我发现如果没有附加消息 错误消息几乎毫无用处 第 XXX 行的断言冲突 很好 但实际上出了什么问题 我认为断言的一个很
  • 在 Javascript 中迭代数组

    我是一个 JavaScript 新手 我正在尝试练习一些示例 JavaScript 问题 当涉及到迭代数组的问题时 我有点困惑 有人能指出我正确的方向吗 我正在尝试接受价值观oldArray 分别添加 5 并存储在newArray var
  • Windows Phone 7 上的 Dispatcher.Invoke()?

    在回调方法中 我尝试获取文本框的文本属性 如下所示 string postData tbSendBox Text 但因为它不是在 UI 线程上执行 所以它给了我一个跨线程异常 我想要这样的东西 Dispatcher BeginInvoke
  • 从 powershell 脚本引用 .Net .dll

    您能帮我从 powershell 脚本引用 Net dll 吗 我正在使用 powershell ISE 编写 调试脚本 我有一些引用 Nuget 包的 net 代码 我想将该代码嵌入到 powershell 脚本中 如果我在 C WIND
  • 创建片段时的NPE

    我正在创建一个关于Fragment with sensorEventlitener 主要活动主办fragment如下代码所示 但在运行时我收到下面发布的内容logcat Errors 主要活动 public class MainActivi
  • 用于查找应用于特定分支的标签的命令

    用于查找应用于特定分支的标签的命令 假设我有一个名为 BR test 的分支名称 我想知道该分支上应用的所有标签是什么 如果这是 UCM 一个简单的lsbl就足够了 cleartool lsbl stream myStream mypvob
  • Django 的内存错误

    我有一个 Django 应用程序 它将大量数据加载到 sqlite3 数据库文件中 我们正在谈论数百万个条目 这些条目输入到一个函数中 在执行的某个时刻会抛出异常 File root codebase lib python2 6 site
  • 从单例类中检索 Ruby 对象?

    可以访问单例类 https ruby doc org core 2 5 1 Object html来自 Ruby 对象 some object singleton class 是否可以进行相反的操作 在单例类中访问原始对象 class lt
  • 找不到 com.google.android.gms:play-services:7.3.0

    我有来自 Android Studio gradle 的日志 Error A problem occurred configuring project ParseStarterProject gt Could not resolve all
  • 返回对象中项目总数的最佳 RESTful 方法是什么?

    我正在为我参与的一个大型社交网站开发 REST API 服务 到目前为止 它运行良好 我可以发出GET POST PUT and DELETE请求对象 URL 并影响我的数据 但是 此数据是分页的 一次限制为 30 个结果 通过我的 API
  • 使用 php 缩短 if else 语句

    我有一个关于缩短 if else 语句的问题 我正在尝试使用制作天气应用程序打开天气地图 https openweathermap org weather conditionsAPI 但我不喜欢那些图标 我想像这样更改图标 if desc
  • 如何在 Android 上显示当前可见活动的对话框?

    我的问题类似于这个2年前的问题 https stackoverflow com questions 3136187 how to detect if any of my activity is front most and visible
  • lib 未指定 & loadNamespace 中出现错误

    我的一切都可以使用 R 和 RStudio 但后来我在清理计算机目录和文件时移动了文件夹 现在我收到以下错误消息 R和RStudio应该安装在Program Files or Program Files x86 我应该有两个libPaths
  • 如何爆炸空间分隔的柱子?

    我在 Spark Scala 中有一个示例数据框 其中包含一列和许多其他列 50 并且需要分解 id 示例数据 id name address 234 435 567 auh aus 345 123 muji uk 输出数据 id name
  • MySQL 的 COUNT 运行总计

    我知道set running sum 0 running sum running sum 方法 但是 它似乎不适用于我的情况 我的查询 SELECT DISTINCT date COUNT AS count FROM table1 WHER
  • 如何知道我的项目上运行的是哪个版本的 PyMongo

    我正在开发一个python项目 在需求文件中我有三种不同类型的PyMongo Flask PyMongo 0 3 1 pymongo 2 7 flask mongoengine 0 7 1 如何定义我正在使用哪个版本 如果你有pip安装后
  • 从 Android 打印到 AirPrint 打印机 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁听说过有人在 Android 上
  • 如何使用where子句从存储在PostgreSQL中jsonb列类型的JSON数组中修改或删除特定的JSON对象?

    在我的 Postgres 数据库中 我有一个具有 jsonb 数据类型的表列 在该列中 我存储 JSON 数组 现在 我想删除或修改数组内的特定 JSON 对象 我的 JSON 数组看起来像 ModuleId 1 ModuleName XY
  • 使用一项识别服务保护 2 个不同的 Web 应用程序

    使用一项识别服务保护 2 个不同的 Web 应用程序 身份服务 Thinktecture身份服务V2应用1 Asp net MVC 5应用应用2 Asp net Web API应用 上述应用程序1和应用程序2是不同的项目并托管在不同的服务器
  • 编译器是否优化了净零位移?

    我有一些代码 如下面的代码块 我不允许发布原始代码 cpp我认为正在编译的文件clang Ubuntu clang version 3 5 2 3ubuntu1 tags RELEASE 352 final based on LLVM 3