一、類型介紹
1、有符號整型 int
舉個栗子:-1,+8
int分為int8、int16、int24 ......,8位一步,直到int256
如果后面的數(shù)字省略,則默認為int256
int8后面的8是什么意思呢?
即用8位二進制來存儲(其中左邊第1位用來表示 + - 符號),代表可存儲的數(shù)字范圍,如:
11111111 ~ 01111111,左邊第1位用來表示符號,1表示負,0表示正,
換算成十進制則為 -(1+ 2 + 4 + 8 + 16 + 32+ 64) ~ (1+ 2 + 4 + 8 + 16 + 32+ 64)
即可存儲 -127 ~ 127 之間 255 個數(shù)字。
也可以理解成存儲范圍為2的多少次方。
2、無符號整型 uint
舉個栗子:0,200
uint分為uint8、uint16、uint24 ......,8位一步,直到uint256
如果后面的數(shù)字省略,則默認為uint256
uint8代表可存儲的數(shù)字范圍,用8位二進制來存儲(左邊第1位不用來表示 + - 符號,即大于等于0的數(shù)),如:
00000000 ~ 11111111
即可存儲 0 ~ 255 之間 255 個數(shù)字。
也可以理解成存儲范圍為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;
}
}

思考:
為什么要定義這么多位數(shù)不同的類型?
答:根據(jù)存儲需要去定義最合適的存儲范圍,可節(jié)約內(nèi)存,提高程序運行速度。
三、整型字面量
contract Test
{
function test1() constant returns (uint) {
//uint8 a = 2 ** 800; //超過了uint8的范圍,編譯會報錯
uint8 a = 2 ** 800 - 2 ** 800 + 5; //這樣是OK的,主要是看結(jié)果
return a;
}
function test2() constant returns (uint) {
uint8 a = 111111111111111111111111111111 - 111111111111111111111111111000; //這樣也是OK的,只要結(jié)果不超過數(shù)據(jù)類型的范圍
return a;
}
function test3() constant returns (uint) {
//小數(shù)運算
//在Solidity中,沒有float和double類型,做乘除法運算時,小數(shù)無條件舍棄。
var c = 0.5*8;
return c;
}
}
總之,在計算過程中,字面量怎么計算都行,只要計算出來的結(jié)果不超過范圍,就可以這樣書寫,否則就會出錯。