"trap"与整数下溢/溢出的关系是什么意思?



阅读Internet Computer's Motoko的文档:

https://sdk.dfinity.org/docs/languages/motoko-at-a-glance.html _bounded_numbers_trapping

我意识到我没有一个很好的模型来描述"陷阱"这个词。意味着:

有界数字(trap) Nat8, Nat16, Nat32, Nat64, Int8, Int16,Int32, Int64

溢流和底流捕集器

需要指定类型注释

字面量:13,0xf4, -20, 1_000_000

是否意味着如果试图写一个会导致溢出/下溢的数字,该整数将保持固定在最大值/最小值?

"陷阱"一词的来源是什么?在这种情况下?它在这里的确切含义是什么?

此上下文中的陷阱将导致执行中止。储罐仍然会很好,但是对储罐的调用将会失败。请参阅手册的这一部分。

作为演示,我从其中一个模板中设置了一个Nat8类型的计数器,因此它应该支持值0..并将其初始化为250:

$ cat counter-canister/main.mo 
actor {
stable var currentValue: Nat8 = 250;
public func increment(): async () {
currentValue += 1;
};
public query func getValue(): async Nat8 {
currentValue;
};
};

然后点击"递增"按钮。它按预期从250增加到255,然后在下一次单击时,这显示在浏览器控制台中:

vendor.e49a5b15.js:831 Uncaught (in promise) Error: Call was rejected:
Request ID: 0f549a49b80b31831e423196d086e36c12df51896ffaaa59e99bae7fa66047aa
Reject code: 5
Reject text: Canister ryjl3-tyaaa-aaaaa-aaaba-cai trapped explicitly: arithmetic overflow
at pollForResponse (vendor.e49a5b15.js:831)
at async n (vendor.e49a5b15.js:838)
at async HTMLButtonElement.n (index.4a11dcea.js:5)

重新加载页面显示该值仍然是最大值255。

毒气罐仍然可以正常工作。如果我在这里也放一个减量按钮,我就可以往下数一点,然后再增加数值,直到再次达到极限。

最新更新