Dart2Js 中按位运算,结果错误

2024-01-03

我正在做ZigZag https://developers.google.com/protocol-buffers/docs/encoding?hl=de#varints使用 Dart 对 32 位整数进行编码。这是我正在使用的源代码:

int _encodeZigZag(int instance) => (instance << 1) ^ (instance >> 31);
int _decodeZigZag(int instance) => (instance >> 1) ^ (-(instance & 1));

该代码在 DartVM 中按预期工作。

但在 dart2js 中_decodeZigZag如果我输入负数,函数将返回无效结果。例如-10. -10被编码为19并且应该解码回-10,但它被解码为4294967286。如果我跑(instance >> 1) ^ (-(instance & 1))在 Chrome 的 JavaScript 控制台中,我得到了预期的结果-10。这对我来说意味着 Javascript 应该能够使用它的数字模型正确运行这个操作。

但 Dart2Js 生成以下 JavaScript,它看起来与我在控制台中测试的代码不同:

return ($.JSNumber_methods.$shr(instance, 1) ^ -(instance & 1)) >>> 0;

为什么 Dart2Js 在函数中添加了使用过的右移 0 ?如果没有转变,结果将如预期。

现在我想知道,这是 Dart2Js 编译器中的错误还是预期的结果?有没有办法强制 Dart2Js 输出正确的 javascript 代码?

还是我的 Dart 代码错误?

PS:还测试了将 XOR 拆分为其他操作,但 Dart2Js 仍在添加右移:

final a = -(instance & 1);
final b = (instance >> 1);

return (a & -b) | (-a & b);

结果是:

a = -(instance & 1);
b = $.JSNumber_methods.$shr(instance, 1);
return (a & -b | -a & b) >>> 0;

出于效率原因,dart2js 将 Dart 数字编译为 JS 数字。然而,JS 只提供一种数字类型:双精度数。此外,JS 中的位操作总是被截断为 32 位。

在许多情况下(例如密码学),处理无符号 32 位更容易,因此 dart2js 编译位操作,使其结果是无符号 32 位数字。

两种选择(签名或未签名)都不是完美的。最初 dart2js 编译为带符号的 32 位,只有当我们过于频繁地绊倒它时才进行更改。正如您的代码所示,这并不能消除问题,只是将其转移到不同的(希望频率较低的)用例。

不合规的数字语义一直是 dart2js 中长期存在的错误,但修复它需要时间,并且可能会减慢生成的代码的速度。在短期内,Dart 开发人员(编译为 JS)需要了解此限制并解决它。

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

Dart2Js 中按位运算,结果错误 的相关文章

随机推荐

  • 如何找到UILabel的行数

    我使用换行方法在 UILabel 中显示文本 现在我想知道 UILabel 中有多少行 如果有任何可能的方法可以找到 UILabel 的行数 Thanks 正如所指出的 这篇文章涉及如何获取高度 而不是行数 要获取行数 获取单个字母的高度
  • 中断 Simpy 中较早的超时事件

    我想创建一个带有服务器的系统 在准备好提供服务之前需要时间进行设置 每当有顾客到达队列时 就会建立一个服务器 先到的顾客将抢占先打开的服务器 如下所示 客户 1 到达并请求服务器 服务器 1 在 t1 秒内完成设置 客户 2 到达并请求服务
  • Wordpress 插件激活标头已发送错误

    我快要疯了 错误 插件在执行期间生成了 4 个意外输出字符 激活 如果您注意到 标头已发送 消息 则存在问题 对于联合供稿或其他问题 请尝试停用或删除 这个插件 删除不必要的空白或换行符 这将消除错误 也删除最后一个 gt 尝试下面的代码
  • 从 QTableView 自定义委托中选择组合框的项目

    我使用自定义委托在 QTableView 中显示一列组合框 所有组合框的值都是相同的 因此给我带来麻烦的并不是人口部分 我希望它们显示为所选项目 即我可以从数据库检索的一些值 我可以从委托访问数据库 但为了发送我的请求 我需要组合框的行 所
  • C++ 中使用标签进行静态结构初始化

    我已经在 stackoverflow 中搜索了答案 但找不到相关的内容 我试图通过指定其标签来使用初始值初始化静态结构实例 但在编译时出现错误 src version cpp 10 error expected primary expres
  • 如何忽略/绕过重写的方法?

    我对 Java 相当陌生 想知道如何完成以下任务 以及它是否被认为是不好的风格 即使它是可能的 谢谢 Fish f Fish is a superclass Tuna t new Tuna to which Tuna is a subcla
  • ctags、vimwiki、vim 和 tagbar-plugin

    我尝试为 wiki 文件 vimwiki 创建标签 这是我对 ctags 的定义 存储为ctags cnf langdef vimwiki langmap vimwiki wiki regex vimwiki t 1 h heading1
  • 为什么一个类只有一个析构函数? [复制]

    这个问题在这里已经有答案了 有人问我一个问题 因为一堂课有multiple constructors但为什么它只有one destructor 我举了下面的例子 class abc public int a abc cout lt lt D
  • 如何为 jQuery UI 进度条的值设置动画?

    我已经设置了 jQuery UI 进度条 但无法使用 jQuery animate 来为其值设置动画 关于如何实现这项工作有什么想法吗 The percentDone变量保存一个从 0 到 100 的数字 显示滚动条应该有多远 这很好用 我
  • 整数舍入例程

    教程中的整数算术让我感到困惑 准确地说 是整数除法 看似首选的方法是将除数转换为浮点数 然后将浮点数四舍五入到最接近的整数 然后将其转换回整数 include
  • 使用java实现RSA

    我正在java中实现RSA 我遇到了下面给出的代码 它在解密明文后以数字形式显示明文 但我希望它是我输入的简单英语 我不想使用java api 测试Rsa Java import java io IOException import jav
  • 奇怪的挥杆重量级和轻量级混合问题

    由于我们已将 java 版本从 6u5 升级到 6u18 该应用程序在 WinXP 上运行 因此基于 swing 的应用程序出现了问题 我们的应用程序包含一个驻留在 JFrame 中的 Canvas 对象 该应用程序在画布上绘制内容 每次我
  • R 中的离散全局网格

    我有一个数据集 由与某些 Z 值相关的纬度 经度对组成 例如有关植物植被覆盖程度的数据 我想对这些数据的空间分布进行一些分析 为此 需要对邻近数据点进行分类 我想使用离散全局网格 例如二十面体斯奈德等面积 ISEA 网格或由DGGRID h
  • 如何捕获 KILL 或 HUP 或用户中止信号?

    我有一个在我的 Linux 服务器后台运行的脚本 我想捕获诸如重新启动之类的信号或任何会杀死该脚本的信号 并在实际退出之前保存任何重要信息 我认为我需要捕获的大部分内容是SIGINT SIGTERM SIGHUP SIGKILL 如何捕获这
  • USB 24 位音频流描述符

    我正在制作 USB 耳机的演示 并且对 USB 的音频端点描述符有疑问 我有一个工作的 8 48kHz 16 位音频流 我可以在音频设备的 Windows 属性中选择任何采样频率 我使用以下描述符 Code Interface 2 Spea
  • 插入新值的最佳方式

    我想使用 pandas 数据框来跟踪我将在交易日实时下载的一些市场数据 假设我想记录 AAPL 和 GOOG 的价格 我首先创建一个数据框 prices DataFrame columns AAPL GOOG 假设第一个数据点出现在时间 t
  • EF - WithOptional - 左外连接?

    使用以下一对一模型 均具有导航属性 public class Foo public int Id get set public virtual Bar Bar get set public class Bar public int Id g
  • 升级到 kafka-streams:5.5.0-css (Apache Kafka 2.5.0) 后获取 GlobalKTable 的存储崩溃 [已解决]

    我有一个使用 GlobalKTable 的 Spring Boot 应用程序 它工作正常 直到从 5 3 2 css 更新到 kafka streams 5 5 0 css 与 Apache Kafka 2 5 0 兼容的 Confluen
  • Android 形状中的形状

    我想要一个shape具有两种颜色边框轮廓的元素 我可以使用单色轮廓solid元素 但这只允许我画一条线 我尝试使用两个stroke我的形状中的元素 但这也不起作用 有没有办法在形状中绘制形状或在我的形状周围绘制两条线 顺便说一句 它有圆角
  • Dart2Js 中按位运算,结果错误

    我正在做ZigZag https developers google com protocol buffers docs encoding hl de varints使用 Dart 对 32 位整数进行编码 这是我正在使用的源代码 int