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

注意:移位运算和整型类似,以为运算结果的政府取决于运算符左边的数,且不能进行负移位,例如可以-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;
    }
}

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

你可能感兴趣的:(敲呀敲代码,以太坊,智能合约,区块链)