因此,我使用Remix并有以下代码:
pragma solidity ^0.4.11;
contract Negs {
event Print(string _name, uint _value);
function Test() {
var startValue = 1000;
var endValue = 800;
Print ("Change1 - ", endValue / startValue);
Print ("Change2 - ", 10*endValue / startValue);
Print ("Change3 - ", 100*endValue / startValue);
Print ("Change4 - ", 1000*endValue / startValue);
}
}然后查看一下右边的“启动测试”小框中的事件,得到以下值:
我知道变化1应该是零,因为没有小数,得到了that..but,其他的呢?为什么Change3不是80岁,change4 800岁呢?
发布于 2017-06-18 18:02:35
在稳固性中,var是在第一次分配时确定类型,并采取任何适合的类型。阅读警告这里。因此,您的代码转换为:
uint16 startValue = 1000;
uint16 endValue = 800;然后,您的计算就会溢出,因为它会转换为:
(100*800 % (2**16)) / 1000 = 14和
(1000*800 % (2**16))/1000 = 13小心var,并为它分配一个您知道在运行时会很好的类型!此外,无论何时需要适当的SafeMath图书馆,都要使用secure+safe。
https://ethereum.stackexchange.com/questions/18266
复制相似问题