以太坊(九)Solidity数据类型-整型(Integer)

int/uint:变长的有符号无符号整型。变量支持的步长以8递增,支持从uint8uint256,以及int8int256。需要注意的是,uintint默认代表的是uint256int256

什么是有符号整型,什么是无符号整型

无符号整型(uint)是计算机编程中的一种数值资料型别。有符号整型(int)可以表示任何规定范围内的整数,无符号整型只能表示非负数(0及正数)。

有符号整型能够表示负数的代价是其能够存储正数的范围的缩小,因为其约一半的数值范围要用来表示负数。如:uint8的存储范围为0 ~ 255,而int8的范围为-127 ~ 127

如果用二进制表示:

  • uint8: 0b00000000 ~ 0b11111111,每一位都存储值,范围为0 ~ 255
  • int80b11111111 ~ ob01111111,最左一位表示符号,1表示0表示,范围为-127 ~ 127

支持的运算符

  • 比较:<=<==!=>=>,返回值为bool类型。

  • 位运算符:&|,(^异或),(~非)。

  • 数学运算:+-,一元运算+*/,(%求余),(**次方),(<<左移),(>>右移)。

Solidity目前沒有支持double/float,如果是 7/2 会得到3,即无条件舍去。但如果运算符是字面量,则不会截断(后面会进一步提到)。另外除0会抛异常 ,我们来看看下面的这个例子:

同其它语言一样,整数的除法运算总是会被截断,如果是 7/2 会得到3,即无条件舍去。

但使用字面量(我的理解其实就是常量)的方式,var e = 1 / 4的情况,则不会截断。但由于测试时使用最新0.4.22版本,语言还没有实现定点小数,故下面的这个例子会报错。

pragma solidity ^0.4.0;

contract IntegerTest{
    function get() returns (int){
        int a = 1;
        int b = 4;

        var d = a / b;//0

        var e = 1 / 4;//未截断
        //UnimplementedFeatureError: Not yet implemented - FixedPointType.

        return d;
    }
}

移位

左移位x<相当于执行x * 2**y,右移位x >> y相当于执行x / 2**y。意味着对一个负数移位会保留符号。

pragma solidity ^0.4.0;

contract IntegerTest{
    function shift() returns (int, int, int, int){
        var a = -1 << 2;//-4
        var b = -1 >> 2;//0 (这里由于截断机制,所以不是负小数,而是0)
        var c = 1 << 2;//4
        var d = 1 >> 2;//0
        return (a, b, c, d);
    }
}

异常

除以零或对零取模,对一个值移负数位会抛出运行时异常。

pragma solidity ^0.4.0;

contract IntegerTest{
    function exp() {
        uint a = 1;
        uint b = 0;

        //var x = a / b;//VM Exception: invalid opcode

        int c = -1;

        //var y = a >> c;//VM Exception: invalid opcode
    }
}


整数字面量

整数字面量,由包含0-9的数字序列组成,默认被解释成十进制。在Solidity中不支持八进制,前导0会被默认忽略,如0100,会被认为是100

小数由.组成,在他的左边或右边至少要包含一个数字。如1..11.3均是有效的小数。

字面量本身支持任意精度,也就是可以不会运算溢出,或除法截断。但当它被转换成对应的非字面量类型,如整数或小数。或者将他们与非字面量进行运算,则不能保证精度了。

pragma solidity ^0.4.0;

contract IntegerLiteral{
  function integerTest() returns (uint, uint, uint){
    //超出运算字长了
    var i = (2**800 + 1) - 2**800;
    var j = 1/3*3;
    //小数运算
    var k = 0.5*8;
    return (i, j,k);
  }
}

你可能感兴趣的:(以太坊(九)Solidity数据类型-整型(Integer))