一、类型介绍
1、有符号整型 int
举个栗子:-1,+8
int分为int8、int16、int24 ......,8位一步,直到int256
如果后面的数字省略,则默认为int256
int8后面的8是什么意思呢?
即用8位二进制来存储(其中左边第1位用来表示 + - 符号),代表可存储的数字范围,如:
11111111 ~ 01111111,左边第1位用来表示符号,1表示负,0表示正,
换算成十进制则为 -(1+ 2 + 4 + 8 + 16 + 32+ 64) ~ (1+ 2 + 4 + 8 + 16 + 32+ 64)
即可存储 -127 ~ 127 之间 255 个数字。
也可以理解成存储范围为2的多少次方。
2、无符号整型 uint
举个栗子:0,200
uint分为uint8、uint16、uint24 ......,8位一步,直到uint256
如果后面的数字省略,则默认为uint256
uint8代表可存储的数字范围,用8位二进制来存储(左边第1位不用来表示 + - 符号,即大于等于0的数),如:
00000000 ~ 11111111
即可存储 0 ~ 255 之间 255 个数字。
也可以理解成存储范围为2的多少次方。
二、测试Demo
pragma solidity ^0.4.17;
contract Test {
uint8 _a;
function Test(uint8 a) {
_a = a;
}
function setA(uint8 a) {
_a = a;
}
function a() constant returns (uint8) {
return _a;
}
function add(uint8 a, uint8 b) public constant returns(uint8) {
return a + b; //测试输入255,1试试,会报超出范围的错误
}
function div() constant returns (uint z) { //做除法
uint x = 9;
uint y = 2;
z = x / y;
return z;
}
}
思考:
为什么要定义这么多位数不同的类型?
答:根据存储需要去定义最合适的存储范围,可节约内存,提高程序运行速度。
三、整型字面量
contract Test
{
function test1() constant returns (uint) {
//uint8 a = 2 ** 800; //超过了uint8的范围,编译会报错
uint8 a = 2 ** 800 - 2 ** 800 + 5; //这样是OK的,主要是看结果
return a;
}
function test2() constant returns (uint) {
uint8 a = 111111111111111111111111111111 - 111111111111111111111111111000; //这样也是OK的,只要结果不超过数据类型的范围
return a;
}
function test3() constant returns (uint) {
//小数运算
//在Solidity中,没有float和double类型,做乘除法运算时,小数无条件舍弃。
var c = 0.5*8;
return c;
}
}
总之,在计算过程中,字面量怎么计算都行,只要计算出来的结果不超过范围,就可以这样书写,否则就会出错。
网友评论