gpt4 book ai didi

dart - 如何在 Dart 中使用 int 与在 c# 或 java 中使用 int 相同

转载 作者:行者123 更新时间:2023-12-03 04:12:42 27 4
gpt4 key购买 nike

我是 Dart 的新手,并从 c# 移植了一个项目。在整个代码中使用了 int32 位。
简单的表达方式如

(someInt1 * ((someInt2 * someInt3) - someInt4 - (someInt5 * someInt6) - someInt7 )
比较时会给出不一致的结果,就像在 c# 代码中一样,它会超出其大小并返回负值,但这已在代码中进行了处理,这正是我所需要的。
有没有办法可以故意使用 32bit int 而不是 Dart 的 64bit ?

最佳答案

Dart 没有原生的 32 位整数类型。int type 在 native 运行时是 64 位二进制补码类型,在编译为 JavaScript 时它是非小数 64 位浮点类型(因为这就是 JavaScript 所具有的)。
最通用的解决方案是使用 Int32 fixnum package 输入.然后其他人担心你的问题。它比只使用 int 效率低。操作,但它将保持一致的 32 位语义。
取决于 int 的溢出行为type 不会在所有平台上都一样。
如果您只关心 native 代码,并且您的表达式仅使用 * , -+如上,您可以调用toSigned结果上。这为您提供了结果的低 32 位,这与在整个计算中使用 32 位数字的结果相同:

var result = 
(someInt1 * ((someInt2 * someInt3) - someInt4 - (someInt5 * someInt6) - someInt7).toSigned(32);
它实际上并没有使用 32 位数字,如果你也进行除法,它也不起作用。
当编译成 JavaScript 时,它的工作方式不同,因为中间结果大于 253 时的溢出行为不同。
您可以选择做 .toSigned(32)在每个中间结果上:
var result = ((someInt1 *
((((someInt2 * someInt3).toSigned(32) - someInt4).toSigned(32) -
(someInt5 * someInt6).toSigned(32))
.toSigned(32))
.toSigned(32)) -
someInt7)
.toSigned(32);
不是特别可读,编译成 JavaScript 时仍然不够,因为即使是两个 32 位整数相乘也可能在结果表示为 double 时丢失精度。

关于dart - 如何在 Dart 中使用 int 与在 c# 或 java 中使用 int 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64019176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com