首页 > 其他分享 >Solidity数据类型

Solidity数据类型

时间:2022-12-01 12:33:26浏览次数:32  
标签:function nums uint256 Solidity 数据类型 uint 数组 public

Solidity 是一种静态类型语言,这意味着每个变量(状态变量和局部变量)都需要在编译时指定变量的类型。

Solidity 提供了几种基本类型,并且基本类型可以用来组合出复杂类型。

Solidity数据类型_数组

除此之外,类型之间可以在包含运算符号的表达式中进行交互。

“​​undefined​​​”或“​​null​​​”值的概念在Solidity中不存在,但是新声明的变量总是有一个 默认值 ,具体的默认值跟类型相关。 要处理任何意外的值,应该使用错误处理来恢复整个交易,或者返回一个带有第二个​​bool​​ 值的元组表示成功。


bool/布尔类型

布尔值的取值范围为 true 和 false 。

默认值:​​false​

pragma solidity ^0.8.0;

contract TestBool {
error NotEqual(bool A,bool B);
bool public A; // false
bool public B = true; //true
// require(A==B,"A not equal B");

if (A != B) {
error NotEqual(A,B);
}
}

运算符:

  • ​!​​(逻辑非)
  • ​&&​​ (逻辑与, “and” )
  • ​||​​ (逻辑或, “or” )
  • ​==​​ (等于)
  • ​!=​​ (不等于)

int、uint/整数类型

int 有符号整型

默认为​​int256​

不同位长的整形范围如下:

  • ​int8​​ 取值范围:-(2 ** 7)到 2 ** 7 -1
  • ​int16​​取值范围:-(2 ** 15)到 2 ** 15 -1
  • ...
  • ​intX​​取值范围:-(2**​​X​​-1)到 2**(​​X​​-1) -1
  • ​int256​​取值范围:-(2 ** 255)到 2 ** 255 -1

uint 无符号整型

默认为​​uint256​

不同位长的整形范围如下:

  • ​uint8​​取值范围:0 到 2 ** 8 - 1
  • ​uint16​​取值范围:0 到 2 ** 16 - 1
  • ...
  • ​uintX​​取值范围:0 到 2 ** ​​X​​ - 1
  • ​uint256​​取值范围:0 到 2 ** 256 - 1

运算符:

  • 比较运算符: <= , < , == , != , >= , > (返回布尔值)
    • 位运算符: & , | , ^ (异或), ~ (位取反)
    • 移位运算符: << (左移位) , >> (右移位)
    • 算数运算符: + , - , 一元运算负 - (仅针对有符号整型), * , / , % (取余或叫模运算) , ** (幂)

    对于整形 X,可以使用 type(X).min 和 type(X).max 去获取这个类型的最小值与最大值。

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;

    contract TestIntval {
    int8 public i8 = -1;
    int public i256 = 456;
    int public i = -123; // int 等同于 int256
    // int 的最大最小值
    int public minInt = type(int).min;
    int public maxInt = type(int).max;

    uint8 public u8 = 1;
    uint256 public u256 = 456;
    uint public u = 123; // uint 等同于 uint256
    // uint 的最大最小值
    uint public minUInt = type(uint).min;
    uint public maxUInt = type(uint).max;


    function mini() public pure returns(uint8){
    return type(uint8).max;
    }
    }

    0.8.0 开始,算术运算有两个计算模式:一个是 “wrapping”(截断)模式或称 “unchecked”(不检查)模式,一个是”checked” (检查)模式。 默认情况下,算术运算在 “checked” 模式下,即都会进行溢出检查,如果结果落在取值范围之外,调用会通过 失败异常 回退。 你也可以通过 ​​unchecked { ... }​​切换到 “unchecked”模式

    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.0;
    contract C {
    function f(uint a, uint b) pure public returns (uint) {
    // 减法溢出会返回“截断”的结果
    unchecked { return a - b; }
    }
    function g(uint a, uint b) pure public returns (uint) {
    // 溢出会抛出异常
    return a - b;
    }
    }

    Solidity数据类型_Solidity_02

    调用 ​​f(2, 3)​​将返回 ​​2**256-1,​​ 而​​ g(2, 3)​​ 会触发失败异常。

    ​unchecked​​ 代码块可以在代码块中的任何位置使用,但不可以替代整个函数代码块,同样不可以嵌套。

    此设置仅影响语法上位于 ​​unchecked​​ 块内的语句。 在块中调用的函数不会此影响。

    address/地址

    默认值: 0x0000000000000000000000000000000000000000

    运算符:

  • <=, <, ==, !=, >= and >
  • 示例:

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;

    contract TestAddress {
    //与其他机器语言相区别的类型就是这个address 类型,160-bit/20byte
    address public myAddr = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    //合约自己的地址
    address contractAddress = address(this);
    //跟普通的地址类型一样,但多了两个方法 transfer/send 这两个方法后面章节会讲到
    // address sender = payable(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4);
    //可以使用 balance 属性来查询一个地址的余额
    function getBalance()
    public view
    returns (uint256, uint256)
    {
    require(myAddr.balance < contractAddress.balance, "1 must lg 2");
    return (myAddr.balance, contractAddress.balance);
    }
    }

    Solidity数据类型_数组_03

    bytes/字节数组

    在计算机中的最小存储单位是 bit(位)

    • 1byte等于8位
    • Solidity中,byte可以赋值为
    • 16进制数字
    • 单引号的单个或多个字符

    定长字节数组

    bytes1 后面数字1是表示1字节 bytes默认等于bytes1
    Bytes2 后面数字2是表示2字节
    Bytes3 后面数字3是表示3字节
    bytes4 后面数字4是表示4字节

    ...

    bytes32 后面数字32是表示32字节

    bytes32 等价于 int256或uint256 的位数

    运算符

  • 比较运算符: <=, <, ==, !=, >=, > (返回布尔型)
    • 位运算符: &, |, ^ (按位异或), ~ (按位取反)
    • 移位运算符: << (左移位), >> (右移位)
    • 索引访问:如果 x 是 bytesI 类型,那么 x[k] (其中 0 <= k < I)返回第 k 个字节(只读)。

    成员变量

    ​.length​​ 表示这个字节数组的长度(只读)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;

    contract BytesTest {
    //定长字节数组,长度不可变
    bytes1 public num1 = 0x12;
    // bytes1 public num1 = 0x112; 溢出最大长度,这样会报错

    // 也可以写成字符串类型
    bytes4 public num2 = "0x12";
    //也支持直接写 16 进制
    bytes4 public num3 = 0x12121212;
    //不足位的补0
    bytes32 public num4 = 'abc'; //0x6162630000000000000000000000000000000000000000000000000000000000

    function getlength1() public view returns (uint8) {
    return num1.length;
    }
    function getlength2() public view returns (uint8) {
    return num2.length;
    }
    }

    string/字符串

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;

    contract TestString {
    string public myString = "hello";
    string public myStringUnicl = unicode"你好"; //unicode 编码
    string public myStringUnicl2 = unicode"你好

    标签:function,nums,uint256,Solidity,数据类型,uint,数组,public
    From: https://blog.51cto.com/sleep666/5897786

    相关文章

    • Solidity 发送ETH和回退函数
      发送ETH3种方式transfer如果异常会转账失败,抛出异常有gas限制,最大2300send如果异常会转账失败,仅会返回false,不会终止执行有gas限制,最大2300call如果异常会转账失败,仅会返......
    • Python中的六种基本数据类型
      Python中分为六种基本数据类型不可变类型(又叫静态数据类型,没有增删改操作):数字(number)、字符串(string)、元组(tuple)可变类型(又叫动态数据类型,支持增删改操作):列表(list......
    • java数据类型
      java语言的数据类型分为:基本数据类型,引用数据类型基本数据类型的四类八种整数byte取值范围-128~127shortintlong浮点数floatdouble字符charbuer......
    • day04 数据类型II
      1.字典类型(dict)字典是一个无序、键不重复且元素只能是键值对的可变的容器。info={"k1":123,"k2":999}键值对键不能重复,重复时数据会被覆盖。info......
    • day03 数据类型I
      数据类型学汉语:拼音、数字、汉字、词语、成语,写文章--->老师批改。学编程:整型、字符串、布尔值,写程序(写代码)->计算机。布尔值(bool):TrueFalse整型(int) :119......
    • JavaScript中常用数据类型,你知道几个?
      作者|慕课网精英讲师Lison这篇文章我们了解一下JavaScript中现有的八个数据类型,当然这并不是JavaScript中的所有数据类型,而是现在版本的TypeScript支持的基本类型,在......
    • Solidity 函数及修改器(modifier)的用法
      //SPDX-License-Identifier:MITpragmasolidity^0.8.13;contractFunction{//多返回值函数functionreturnMany()publicpurereturns......
    • Solidity基础介绍
      solidty跟javascript有一定的相似认识一个最简单的存储合约让我们先看一下最基本的例子。现在就算你都不理解也不要紧,后面我们会有更深入的讲解。//SPDX-License-Identifi......
    • Solidity智能合约结构介绍
      变量局部变量在函数内部声明不存储到链上状态变量在函数外部声明状态变量是永久地存储在链上的值。全局变量提供有关区块链的信息//SPDX-License-Identifier:MITpragmas......
    • Solidity中view和pure的用法
      getter类型的函数可以被view或者pure修饰。view修饰的函数不能改变状态变量。pure则既不能改变状态变量,也不取读取状态变量。//SPDX-License-Identifier:MITpragma......