solidity学习笔记02-数据存储篇

Posted 一袋芋头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solidity学习笔记02-数据存储篇相关的知识,希望对你有一定的参考价值。

solidity学习笔记02-数据存储篇

最近在学习solidity语言,感谢b站先锋教育的视频和郑建勋老师的讲解,参考视频: https://www.bilibili.com/video/BV1St411a7Pk?p=11.
对应视频:P11-P23

(开始干活了,这个文章草稿箱扔了俩月,估计往后也没的空再写学习笔记了,鸽了鸽了,有缘再续)

这部分主要讲解的时solidity语言中各种数组的使用和转换,包括字节数组Bytes,字符串String,Array,二维数组,字面量,每种数据类型的数组都可分为两类,固定的和可变的。

1.ByteArray

  1. 定长字节数组是指一个所占空间固定的数组,每个元素都是一个字节。声明方式如下:
byte bt0;
bytes1 bt1 = 0x01;
bytes2 bt2 = "ab";
bytes3 bt3 = "vae";

  1. byte数组的关键字有为bytes1,bytes2,…,bytes32,步长为1,byte代表byte1,以八个位递增,即是对位的封装。
  2. 实际使用中,定长字节数组常被代替字符串(如声明中的bt2,bt3)
  3. 定长字节数组支持的运算符如下:
    a.比较运算符:<=,>=,==,!=,<,>(返回布尔值)
    b.位运算符:&,|,^(按位异或),~(按位取反),<<(左移位),>>(右移位)
    c.索引(下标)访问:如果x时bytesN,当0<=k<N时,x[k]返回第k个字节。

注意:移位运算和整型类似,以为运算结果的政府取决于运算符左边的数,且不能进行负移位,例如可以-5<<1,但不能5<<-1.

  1. 定长字节数组有成员变量:.length,且不可修改

下面展示 ByteArray.sol

pragma solidity ^0.4.0;

contract ByteArray
    //77 61 6E 67 68 75 61 6A 69 61 6E--wanghuajian
    bytes1 public num1 = 0x77;
    bytes2 public num2 = 0x7761;
    bytes12 public num3 = 0x77616e676875616a69616e;
    
    bytes1 public a =0x77;// 0111 0111  7*16+7=
    bytes1 public b =0x61;// 0110 0001   6*16+1=
    
    function getLength1() public returns(uint)
        
        return num1.length;
    
    function getLength2()public returns(uint)
        
        return num2.length;
    
    function getLength3() public returns(uint)
        
        return num3.length;
    

    //长度一旦确定,不能被修改;必须为lvalue才能被修改
    /*
    function setLength()
        
        num2.length = 10;//长度一旦确定,不能被修改;必须为lvalue才能被修改
    
    */
    
    //byte1也可以进行位运算,返回值也是byte1类型,但是不可修改其制定位置的元素
    function bijiao() public view returns (bool,bool,bool,bool,bool)
        
        return (a>=b,a<=b,a>b,a<b,a==b);
    
    
    function and_B() view public returns(bytes1)
        
        return a & b;
    
     function or_B() view public returns(bytes1)
        
        return a | b;
     
    function no_B() view public returns(bytes1)
        
        return ~b;
     
    function yihuo_B() view public returns(bytes1)
        
        return a ^ b;
    
    function lm_B() view public returns(bytes1)
        
        return a <<1;
     
    function rm_B() view public returns(bytes1)
        
        return a >>1;
    
    //error:不可修改其制定位置的元素
    /*
    function changeContent()
        num3[0]=2;
    
    */ 

2.DynamicBytes

  1. 初始化要用new
   bytes public name = new bytes(2);
  1. 动态字节数组可改变指定位置的元素
	 name[0] = 0x66;
  1. 无论是增加长度(初始化为0)还是push元素,都是加在右边;减小长度也是右侧截断
   function changeLength(uint newLength) public returns(uint)//right 0000
       
       name.length = newLength;
       return name.length;
   
   
   function pushtest()
       
       name.push(0x88);
   

下面展示 DynamicBytes.sol

pragma solidity ^0.4.0;

contract DynamicByte
    
    //初始化要new
    bytes public name = new bytes(2);
    function initName()
        
        name[0]=0x77;
        name[1]=0x61;
    
    function getLength() view returns(uint)
        
        return name.length;
    
    //动态字节数组可改变指定位置的元素
    function changeName() public 
        
        name[0] = 0x66;
    
    
    //无论是增加长度(初始化为0)还是push元素,都是加在右边;减小长度也是右侧截断
    function changeLength(uint newLength) public returns(uint)//right 0000
        
        name.length = newLength;
        return name.length;
    
    
    function pushtest()
        
        name.push(0x88);
    

3.Math

下面展示 Math.sol
本代码讲解整型特性与运算、底层位运算、整数溢出与异常处理、整型字面量。
整型字面量:solidity在计算过程中的中间值,支持任意的精度,如小数。不会发生溢出操作。
只有在将计算结果赋值给特定类型的时候,才会发生截断溢出等操作。

pragma solidity ^0.4.0;

//本代码讲解整型特性与运算、底层位运算、整数溢出与异常处理、整型字面量
contract math
    
    uint num1 = 3;//int256
    uint num2 = 4;//uint256
    
    function add(uint a,uint b) pure public returns(uint)
        return a+b;
    
    
    uint8 a=3;
    uint8 b=4;
    //位运算时a,b的二进制数进行位运算
    function and_B() view public returns(uint)
        
        return a & b;
    
     function or_B() view public returns(uint)
        
        return a | b;
     
    function no_B() view public returns(uint)
        
        return -b;
     
    function yihuo_B() view public returns(uint)
        
        return a ^ b;
    
    function lm_B() view public returns(uint)
        
        return a <<1;
     
    function rm_B() view public returns(uint)
        
        return a >>1;
    
    
    //溢出
    function flow(uint8 _a) pure public returns(uint8)
        
        _a++;
        return _a;
    
    //整型字面量
    function intergerTest() pure public returns(uint)//整形字面量

        uint num = (2**900+1)-2**900;
        return num;
    

再次感谢郑建勋老师的讲解。

以上是关于solidity学习笔记02-数据存储篇的主要内容,如果未能解决你的问题,请参考以下文章

solidity学习笔记01-基础知识

solidity笔记——存储区域memory storage stack——2021.5.12

第119篇 笔记-solidity中的ABI

《solidity学习笔记》chapter 2-solidity基础知识

solidity笔记——modifier用法——2021.5.10

solidity笔记——pure用法——2021.5.13