从零构建以太坊(Ethereum)智能合约到项目实战——学习笔记6
P21 、1-Solidity Types - 整型(Integer) (一)
int/uint:变长的有符号或无符号整型。变量支持的步长以8递增,支持从uint8到uint256,以及int8到int256。需要注意的是,uint和int默认代表的是uint256和int256.
对于有符号整型中,1表示负数,0表示正数。
pragma solidity ^0.4.4; //uint8 uint16 uint24 ..... uint256 //int8 int16 int24 .....int256 //int => int256 等价 //uint => uint256 等价 //int8 有符号 , +1, -1 //uint8 无符号 ,3,8,10 //int8 ->8位 //范围:1111 1111 ~ 0111 1111 //-(1+2+4+8+16+32+64) ~ +(1+2+4+8+16+32+64) // -127 ~ +127 255 //uint8 ->8位 //范围:0000 0000 ~ 1111 1111 //0 ~ (1+2+4+8+16+32+64+128) //0 ~ 255 255 contract Test{ uint8 _a; function Test(uint8 a){ _a=a; } function setA(uint8 a){ _a=a; } function a() constant returns (uint8){ return _a; } }
对于uint 类型的变量_a,输入300,结果输出44(被截取了)
300:100101100
44: 101100
可以看出300前面的3位2进制(100)被截掉了,留下(101100),所以是44
P22 、2-Solidity Types - 整型(Integer) - Var遇到的坑(二)
pragma solidity ^0.4.4; contract Test{ function testVar constant returns(uint8){ uint8 a=100; var b=a; return b; } function testVar1 constant returns(uint){ uint a; //uint8 i 0~255 for(var i=0;i<255;i++) { a=i; } return a; }
function testVar2 constant returns(uint){
uint a;
//uint8 i 0~255
for(uint16 i=0;i<=255;i++)
{
a=i;
}
return a;
}
}
P23 、3-Solidity Types - 整型(Integer) - 比较运算符(三)
支持的运算符:
- 比较:<=、<、==、!=、>=、>,返回值为bool类型。
- 位运算符:&、|、(^异或)、(~非)。
- 数学运算:+、-、一元运算+、*、/、(%求余)、(**次方)、(<<左移)、(>>右移)。
Solidity目前没有支持double/float,如果是7/2会得到3,即无条件舍去。但如果运算符是字面量,则不会截断(后面会进一步提到)。另外除0会抛异常,我们来看看下面的这个例子:
pragma solidity ^0.4.4; contract Test{ uint a; uint b; function Test(){ a=100; b=200; } //<= < == != >= > function test1() constant returns(bool){ return a<=b; } function test2() constant returns(bool){ return a<b; } function test3() constant returns(bool){ return a==b; } function test4() constant returns(bool){ return a!=b; } function test5() constant returns(bool){ return a>=b; } function test6() constant returns(bool){ return a>b; } }
P24 、4-Solidity Types - 整型(Integer) - 与或非异或(四)
pragma solidity ^0.4.4; contract Test{ uint8 a; uint8 b; function Test(){ a=5; // 0000 0101 b=8; // 0000 1000 } //& | ^ ~ function test1() constant returns(uint8){ return a & b;//0 // 0000 0101 // 0000 1000 // 0000 0000 } function test2() constant returns(uint8){ return a | b; //13 // 0000 0101 // 0000 1000 // 0000 1101 //1+4+8 } function test3() constant returns(uint8){ return a ^ b; //13 // 0000 0101 // 0000 1000 // 0000 1101 //1+4+8 } function test4() constant returns(uint8){ return ~a; // 0000 0101 // 1111 1010 // 0+2+0+8+16+32+64+128 = 250 } }
P25 、5-Solidity Types - 整型(Integer) - 加减乘除求余(五)
pragma solidity ^0.4.4; contract Test{ int8 a; int8 b; function Test(){ a=5; // 0000 0101 b=8; // 0000 1000 } // + - * / function test1() constant returns(int8){ return a + b; } function test2() constant returns(int8){ return a - b; } function test3() constant returns(int8){ return a * b; } function test4() constant returns(int8){ return a/b; } }
P26 、6-Solidity Types - 整型(Integer) - 求幂,左移,右移(六)
pragma solidity ^0.4.4; contract Test{ uint8 a; function Test(){ a=8; } function test1(uint8 b) constant returns(uint8){ return a ** b; //a的b次方 } function test2(uint8 b) constant returns(uint8){ return a << b; // 0000 1000 // b = 2 // 0010 0000 // 32 } function test3(uint8 b) constant returns(uint8){ return a >> b; // 0000 1000 // b = 2 // 0000 0010 // 2 } }
P27 、7-Solidity Types - 整型(Integer) - 字面量(七)
pragma solidity ^0.4.4; contract Test{ function test1(uint8 b) constant returns(uint8){ uint8 a=2**800 - 2**800 + 5; return a; } function test2(uint8 b) constant returns(uint){ uint8 a = 111111111111111111111111111111111 - 111111111111111111111111111111000; return a; } }