欢迎光临
黎跃春区块链技术博客

【Solidity智能合约开发第12篇】3分钟了解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会抛异常 ,我们来看看下面的这个例子:

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract Math {

  function mul(int a, int b) pure public returns (int) {

      int c = a * b;
      return c;
  }

  function div(int a, int b) pure public returns (int) {

      int c = a / b;
      return c;
  }

  function sub(int a, int b) pure public returns (int) {

      return a - b;
  }

  function add(int a, int b) pure public returns (int) {

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

如果用5除以0就会抛出异常。

call to Math.div errored: VM error: invalid opcode.
invalid opcode  
    The execution might have thrown.
    Debug the transaction to get more information. 

二、求余 %

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract Math {

  function m(int a, int b) pure public returns (int) {

      int c = a % b; // 10 % 3 -> 1
      return c;
  }
}

三、次方

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract Math {

  function m(uint a, uint b) pure public returns (uint) {

      uint c = a**b; // 2 ** 8 -> 256
      return c;
  }

}

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract Math {

  function yu() pure public returns (uint) {

      uint a = 3; // 0b0011
      uint b = 4; // 0b0100

      uint c = a & b; // 0b0000
      return c; // 0
  }

  function huo() pure public returns (uint) {

      uint a = 3; // 0b0011
      uint b = 4; // 0b0100

      uint c = a | b; // 0b0111
      return c; // 7
  }

  function fei() pure public returns (uint8) {

      uint8 a = 3; // 0b00000011
      uint8 c = ~a; // 0b11111100
      return c; // 252
  }

  function yihuo() pure public returns (uint) {

      uint a = 3; // 0b0011
      uint b = 4; // 0b0100

      uint c = a ^ b; // 0b0111
      return c; // 7
  }
}

五、位移

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract Math {

  function leftShift() pure public returns (uint8) {

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

  function rightShift() pure public 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均是有效的小数。

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract IntegerLiteral{
  function integerTest1() pure public returns (uint) {

    uint8 i = (2**800 + 1) - 2**800; //1
    return i;
  }

  function integerTest2() pure public returns (uint) {

    uint8 j = 2/4.0*10; //5
    return j;
  }

  function integerTest3() pure public returns (uint) {

    uint8 k = 0.5*8; //4
    return k;
  }

  function integerTest4() pure public returns (uint) {

    uint16 c = 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112222 - 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;

    return c; // 1111
  }

}

小结

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

赞(0) 打赏
未经允许不得转载:黎跃春区块链技术博客 » 【Solidity智能合约开发第12篇】3分钟了解Solidity Types – 整型(Integer)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

区块链在线课程、区块链职业技术水平认证考试一网打尽

区块链技术在线课程区块链技术职业认证

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏