【Solidity学习笔记】数据类型——整型(Integer)

2018-04-18  本文已影响345人  海阳之新

一、类型介绍

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;
    }
  
}

总之,在计算过程中,字面量怎么计算都行,只要计算出来的结果不超过范围,就可以这样书写,否则就会出错。

上一篇下一篇

猜你喜欢

热点阅读