黎跃春区块链博客


黎跃春,江湖人称春哥,孔壹学院、 链乎创始人,区块链职业教育布道师,通信和信息技术培养工程区块链高级授课专家。


链乎问答社区
链乎公众号

『0010』 - Solidity Types - 整型(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会抛异常 ,我们来看看下面的这个例子:

一、加 +,减 -,乘 *,除 /

pragma solidity ^0.4.4;

contract Math {

  function mul(int a, int b) constant returns (int) {

      int c = a * b;
      return c;
  }

  function div(int a, int b) constant returns (int) {

      int c = a / b;
      return c;
  }

  function sub(int a, int b) constant returns (int) {
      
      return a - b;
  }

  function add(int a, int b) constant returns (int) {

      int c = a + b;
      return c;
  }
}

二、求余 %

pragma solidity ^0.4.4;

contract Math {

  function m(int a, int b) constant returns (int) {

      int c = a % b;
      return c;
  }
}

三、次方

pragma solidity ^0.4.4;

contract Math {

  function m(uint a, uint b) constant returns (uint) {

      uint c = a**b;
      return c;
  }

}

四、与 &,| 或,非 ~,^ 异或

pragma solidity ^0.4.4;

contract Math {

  function yu() constant returns (uint) {

      uint a = 3; // 0b0011
      uint b = 4; // 0b0100
    
      uint c = a & b; // 0b0000
      return c; // 0
  }

  function huo() constant returns (uint) {

      uint a = 3; // 0b0011
      uint b = 4; // 0b0100
    
      uint c = a | b; // 0b0111
      return c; // 7
  }

  function fei() constant returns (uint8) {

      uint8 a = 3; // 0b00000011
      uint8 c = ~a; // 0b11111100
      return c; // 0
  }
  
  function yihuo() constant returns (uint) {

      uint a = 3; // 0b0011
      uint b = 4; // 0b0100
    
      uint c = a ^ b; // 0b0111
      return c; // 252
  }
}

五、位移

pragma solidity ^0.4.4;

contract Math {

  function leftShift() constant returns (uint8) {

      uint8 a = 8; // 0b00001000
      uint8 c = a << 2; // 0b00100000
      return c; // 32
  }

  function rightShift() constant returns (uint8) {

      uint8 a = 8; // 0b00001000
      uint8 c = a >> 2; // 0b00000010
      return c; // 2
  }

}

  • a << n 表示a的二进制位向左移动n位,在保证位数没有溢出的情况下等价于 a乘以2的n次方
  • a >> n 表示a的二进制位向右移动n位,在保证位数没有溢出的情况下等价于 a除以2的n次方

整数字面量

整数字面量,由包含0-9的数字序列组成,默认被解释成十进制。在Solidity中不支持八进制,前导0会被默认忽略,如0100,会被认为是100,【PS:十六进制可以这么写,0x11】。

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

pragma solidity ^0.4.4;

contract IntegerLiteral{
  function integerTest1() constant returns (uint) {
      
    var i = (2**800 + 1) - 2**800;
    return i;
  }
  
  function integerTest2() constant returns (uint) {
   
    var j = 2/4.0*10;
    return j;
  }
  
  function integerTest3() constant returns (uint) {
    
    
    var k = 0.5*8;
    return k;
  }
  
  function integerTest4() constant returns (uint) {
    
    var c = 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112222 - 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
    
    return c;
  }
  
}

小结

本篇教程中主要介绍了整型中什么是有符号整型,什么是无符号整型,以及它们所支持的一系列运算符。整型字面量中,在没有转换为具体类型时,可以做到高度精准度。

技术交流

  • 区块链技术交流QQ群:348924182

  • 「区块链部落」官方公众号

版权声明:博客中的文章版权归博主所有,未经授权,禁止转载,转载请注明出处,合作请联系:liyc1215(微信)

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦