2.整型与算术运算
在solidity中,基本的整型有int(有符号整型,有正有负)和uint(无符号整型,无负数)。并且他们以8位为区间,int支持int8,int16,int24至int256,uint同理。int默认为int256,uint默认为uint256.
思考一下,为什么solidity要搞这么多整型类型,还分的这么细致呢?
而他们支持的算术操作有以下等:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQbc1Hgk-1612448413885)(C:\Users\49178\AppData\Roaming\Typora\typora-user-images\image-20210204204902966.png)]](https://img-blog.csdnimg.cn/20210204222223241.png#pic_center)
下面我们通过代码来看看他们的基本运算:
基本算术运算
pragma solidity ^0.4.16;
contract Math{
//加
function add(uint a,uint b) public returns(uint){
return a+b;
}
//减
function minus(uint a,uint b) public returns(uint){
return a-b;
}
//乘
function multiply(uint a,uint b) public returns(uint){
return a*b;
}
//除
function divide(uint a,uint b) public returns(uint){
return a/b;
}
//取余
function mod(uint a,uint b) public returns(uint){
return a%b;
}
//幂运算
function square(uint a,uint b) public returns(uint){
return a**b;
}
}
大家可以发现,除了幂运算和我们平常语言有些差别之外,其他的运算已经成为国际通用写法。
位运算
接下来,我们来重点看看位运算,solidity支持的位运算有以下几种
位与&,位或|,位非~,位异或^,左移>>,右移<<,我们来看一个例子:
通过位运算可以得出以下结果。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ukPzxI1-1612448413887)(C:\Users\49178\AppData\Roaming\Typora\typora-user-images\image-20210204213534582.png)]](https://img-blog.csdnimg.cn/2021020422205514.png#pic_center)
我们在编写合约看看:
pragma solidity ^0.4.16;
contract Math{
uint8 a = 3;
uint8 b = 4;
function bitwiseAnd() public returns(uint8){
return a&b;
}
function bitwiseOr() public returns(uint8){
return a|b;
}
function tilde() public returns(uint8){
return ~a;
}
function caret() public returns(uint8){
return a^b;
}
function leftShift() public returns(uint8){
return a<<1;
}
function rightShift() public returns(uint8){
return a>>1;
}
}
查看结果,我们会发现和我们excel中的结果是一样一样的。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2aMhPCBO-1612448413889)(C:\Users\49178\AppData\Roaming\Typora\typora-user-images\image-20210204215330302.png)]](https://img-blog.csdnimg.cn/20210204222109218.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fpd2FzdG9u,size_16,color_FFFFFF,t_70#pic_center)
其次,我们看会发现,我们之前每一次部署的合约,都可以继续访问和调用。哈哈,这就是我们区块链的一个重要特性,且是最重要的特性不可篡改。一旦部署,则永久存在。(当然如果真真真的要改,也是有办法的。)
此外,在这个0.4.16版本,view和pure都已经编译不会报错,大家可以自己试试。
在这里,还得揭晓一个答案,那就是为什么整型会分的那么细呢?当然还是因为我们区块链上的资源是极其宝贵的。所以要在合适的前提下,选择最小的存储类型。同时尽可能地多采用位运算。
复合运算
最后,看看我们的加加、减减
pragma solidity ^0.4.16;
contract Math{
//输出a
function add2(uint a) public returns(uint){
return a++;
}
//输出a+1
function add3(uint a) public returns(uint){
return ++a;
}
//输出a
function minus2(uint a) public returns(uint){
return a--;
}
//输出a-1
function minus3(uint a) public returns(uint){
return --a;
}
}
这个复合运算,在其他编程语言中也是一样的结果。可能很多初学编程的朋友容易搞错,在这里我就再啰嗦一句。
只要记住这句口诀,就不会出错啦。
那就是谁在前,结果输出谁(加号在前,结果加一;数字在前,结果输出数字本身);而变量本身等于运算后的值。
我们上面的两小节,内容都相对简单。下一节,我们则分析solidity中运算值得注意的一点,敬请期待哈。