为什么 1ul << 64 返回 1 而不是 0? [复制]

2024-02-16

考虑下面的代码:

// Simply loop over until 64 is hit. 
unsigned long x = 0;
for (int i = 0; i <= 64; i++) {
  if (i == 64) {
    x = 1ul << i;
    printf("x: %d\n", x);
  }
}

我们知道unsigned long是64位宽,左移1位64位将变成1000...000(1后面有64个零),并且会被截断为0。然而,实际的打印输出给出:

x: 1

奇怪的是,如果我们这样做

printf("x: %d\n", (1ul << 64));

它会打印 0。

谁能解释为什么会发生这种情况?为什么在第一种情况下,程序错误地生成 1 而不是 0,但在第二种情况下却是正确的?


移动一个类型的宽度或多个原因未定义的行为 https://stackoverflow.com/a/4105123/1505939根据§6.5.7/3:

  1. 对每个操作数执行整数提升。方式 结果的 是提升后的左操作数的结果。如果值正确的操作数是负数或大于或等于宽度 提升的左操作数的行为未定义.

这样做的理由是,不同的 CPU 对超大的移位实现不同的行为,并且定义这种情况下的行为过于严格——许多移位需要生成额外的程序集。 (尽管也许它应该是实现定义的而不是未定义的)。

您的观察结果可以通过使用 Intel 系列 CPU 来解释,该 CPU 在硬件中对 64 位类型的移位宽度进行“mod 64”,因此在运行时1ul << 64做了同样的事情1ul << 0会;但在另一种情况下编译时编译器计算1ul << 64使用算术规则。

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

为什么 1ul << 64 返回 1 而不是 0? [复制] 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 为什么 IE10 中的“font-size: 1em”比 Chrome 中的字体大?

    我目前正在开发一个网站 我不明白为什么文本在 IE10 中显示比在 Chrome 中更大 我已确保两个浏览器都设置为 100 缩放 不多也不少 我的 CSS 已重置 body font size 1em 在 Chrome v27 0 145
  • 如何使用 ggplot2 在同一绘图区域内绘制绘图的缩放?

    这个问题看起来很难理解 但是为了说明一下 我举个图来举例 我正在尝试复制这张图 到目前为止 我已经单独完成了图形 但我不知道如何将它们组合在一起 如示例所示 有什么帮助吗 time lt seq from 0 to 10 by 0 5 li
  • 文件夹被锁定,无法解锁

    当我尝试更新或提交项目中的代码时 它告诉我该文件夹已锁定 当我尝试 释放锁定 时 它说该工作空间中没有任何内容可以解锁 这意味着什么 为什么我无法更新 提交甚至清理项目 右键单击您的 Subversion 工作目录文件夹 然后选择Torto
  • 在 Macos 上,rails new 失败并显示“无法设置其他经过身份验证的数据”

    我正在尝试让 ruby on Rails 在带有 M1 芯片的新 Mac 上运行 跑步rails new之后失败append gitignore出现以下错误 Library Ruby Gems 2 6 0 gems activesuppor
  • VS2010 程序集加载错误

    当我尝试在 Visual Studio 2010 中构建 ASP NET 4 项目时 出现以下错误 无法加载文件或程序集 file C Dev project trunk bin Elmah dll 或其依赖项之一 不支持操作 HRESUL
  • 如何将容器作为服务的参数

    在我的服务构造函数中 public function construct EntityManager entityManager SecurityContextInterface securityContext this gt securi
  • Tastypie 和原始 sql

    如何让 Tastypie 获取原始 SQL 查询集 queryset Foo objects raw sql 似乎不起作用 难道不可能吗 queryset super class name self get query set return
  • runnodes 时发生非法反射访问操作

    我正在尝试运行我的 corda 节点 但我遇到了一个奇怪的问题 节点正在正确启动 正如您在日志中看到的那样 C Repositorio cordapp template kotlin build nodes gt runnodes log
  • 如何在 Python (2.7 + ) 中等待 ENTER 键按下? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想知道一种简单的方法来等待用户按下特定的键 例如 Enter 或 Escape 但不是两者 然后在感应到按键后进一步执行代码 Try r
  • 如何在 Laravel 项目中添加 jQuery

    我是 Laravel 框架的新手 我想在使用 Laravel 框架构建的 Web 应用程序中使用 jQuery 但不知道怎么链接jQuery 库在 Laravel 项目中 你可以使用在线图书馆
  • 在数据框的列上进行 Strsplit [重复]

    这个问题在这里已经有答案了 我有一个data frame其中变量之一是向量 或列表 如下所示 MyColumn lt c A B C D E F G MyDF lt data frame group id 1 4 val 11 14 cat
  • 如何使用正则表达式搜索带括号的字符串?

    我有一个 txt 文件 其中包含以下字符串 A 123 B 456 Ab 123 我想搜索Ab 123 在txt文件中 我尝试过的 re search r Ab 123 string 有 12 个具有特殊含义的字符 您可以使用以下命令转义到
  • 与 preg_match_all 匹配

    我得到这个正则表达式 val 123 4 56 regex preg match all regex val matches 谁能告诉我为什么这只匹配最后一个数字 56 而不是每组数字 这是上面的正则表达式运行后 matches 包含的内容
  • 使用不带 InvokePattern 或 clickablePoint 的 UI Automation在单击按钮时调用

    我尝试将点击消息发送到 或调用 另一个应用程序中的按钮 我使用 UISpy exe 并可以找到我需要的元素 但它没有 id 没有 clickablePoint 也没有 Invoke 模式 我尝试了以下代码 var processStartI
  • 一种为对象数据库建立索引的方法

    我正在使用对象数据库 ZODB 来存储许多对象之间的复杂关系 但遇到了性能问题 因此 我开始构建索引以加快对象检索和插入速度 这是我的故事 希望对您有所帮助 最初 当我向数据库添加对象时 我会将其插入专用于该对象类型的分支中 为了防止多个对
  • 没有 JDK 的 JRE 6 (Windows) 上的堆转储

    有没有办法在没有安装 JDK 的远程计算机上创建堆转储 我无法更改安装 设置 并且它在 Windows 上运行 所以我可以随时访问命令行工具 问题是远程计算机上的 Java 应用程序冻结 没有内存不足异常 因此 XX HeapDumpOnO
  • JAXB 解组忽略命名空间将元素属性变成 null

    我正在尝试使用 JAXB 将 xml 文件解组为对象 但遇到了一些困难 实际项目的 xml 文件中有几千行 因此我以较小的规模重现了错误 如下所示 XML 文件
  • 防止“xmlValue”剥离
    标签

    我遇到了一个问题 其中xmlValue剥离 br 我需要保留的标签 或转换为其他角色 然后我可以strsplit on 这是一个例子 gt f lt htmlParse getForm http sites target com site
  • WaitForMultipleObjects 会修改*多个*对象的状态吗? [复制]

    这个问题在这里已经有答案了 使用时WaitForMultipleObjects bWaitAll FALSE http msdn microsoft com en us library windows desktop ms687025 28
  • 为什么 1ul << 64 返回 1 而不是 0? [复制]

    这个问题在这里已经有答案了 考虑下面的代码 Simply loop over until 64 is hit unsigned long x 0 for int i 0 i lt 64 i if i 64 x 1ul lt lt i pri