Solidity极简入门: 2. 数值类型

Solidity中的变量类型

  1. 数值类型(Value Type) :包括布尔型,整数型等等,这类变量赋值时候直接传递数值。
  2. 引用类型(Reference Type) :包括数组和结构体,这类变量占空间大,赋值时候直接传递地址(类似指针)。
  3. 映射类型(Mapping Type) : Solidity里的哈希表。
  4. 函数类型(Function Type)Solidity文档里把函数归到数值类型,但我觉得他跟其他类型差别很大,所以单独分一类。

我们只介绍一些常用的类型,不常用的不讲。这篇介绍数值类型,第3讲介绍函数类型,第4讲介绍引用和映射。

数值类型

1. 布尔型

布尔型是二值变量,取值为truefalse

arduino 复制代码
    // 布尔值
    bool public _bool = true;

布尔值的运算符,包括:

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

代码:

arduino 复制代码
    // 布尔运算
    bool public _bool1 = !_bool; //取非
    bool public _bool2 = _bool && _bool1; //与
    bool public _bool3 = _bool || _bool1; //或
    bool public _bool4 = _bool == _bool1; //相等
    bool public _bool5 = _bool != _bool1; //不相等

上面的代码中:变量_bool的取值是true_bool1_bool的非,为false_bool && _bool1false_bool || _bool1true_bool == _bool1false_bool != _bool1true值得注意的是: &&||运算符遵循短路规则,这意味着,假如存在f(x) || g(y)的表达式,如果f(x)trueg(y)不会被计算,即使它和f(x)的结果是相反的

2. 整型

整型是solidity中的整数,最常用的包括

csharp 复制代码
    // 整型
    int public _int = -1; // 整数,包括负数
    uint public _uint = 1; // 正整数
    uint256 public _number = 20220330; // 256位正整数

常用的整型运算符包括:

  • 比较运算符(返回布尔值): <=<==!=>=>
  • 算数运算符: +-, 一元运算 -+*/%(取余),**(幂)

代码:

ini 复制代码
    // 整数运算
    uint256 public _number1 = _number + 1; // +,-,*,/
    uint256 public _number2 = 2**2; // 指数
    uint256 public _number3 = 7 % 2; // 取余数
    bool public _numberbool = _number2 > _number3; // 比大小

大家可以跑一下代码,看看这4个变量分别是多少。答对奖励个POAP

3. 地址类型

地址类型(address)存储一个 20 字节的值(以太坊地址的大小)。地址类型也有成员变量,并作为所有合约的基础。有普通的地址和可以转账ETH的地址(payable)。其中,payable修饰的地址相对普通地址多了transfersend两个成员。在payable修饰的地址中,send执行失败不会影响当前合约的执行(但是返回false值,需要开发人员检查send返回值)。balancetransfer(),可以用来查询ETH余额以及安全转账(内置执行失败的处理)。

代码

ini 复制代码
    // 地址
    address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;
    address payable public _address1 = payable(_address); // payable address,可以转账、查余额
    // 地址类型的成员
    uint256 public balance = _address1.balance; // balance of address

Copy

下一讲介绍函数的时候,会介绍如何使用地址类型。

4. 定长字节数组

字节数组bytes分两种,一种定长(byte, bytes8, bytes32),另一种不定长。定长的属于数值类型,不定长的是引用类型(之后讲)。 定长bytes可以存一些数据,消耗gas比较少。

代码:

ini 复制代码
    // 固定长度的字节数组
    bytes32 public _byte32 = "MiniSolidity"; 
    bytes1 public _byte = _byte32[0]; 

MiniSolidity变量以字节的方式存储进变量_byte32,转换成16进制为:0x4d696e69536f6c69646974790000000000000000000000000000000000000000

_byte变量存储_byte32的第一个字节,为0x4d

5. 枚举 enum

枚举(enum)是solidity中用户定义的数据类型。它主要用于为uint分配名称,使程序易于阅读和维护。它与C语言中的enum类似,使用名称来代替从0开始的uint

java 复制代码
    // 用enum将uint 0, 1, 2表示为Buy, Hold, Sell
    enum ActionSet { Buy, Hold, Sell }
    // 创建enum变量 action
    ActionSet action = ActionSet.Buy;

它可以显式的和uint相互转换,并会检查转换的正整数是否在枚举的长度内,不然会报错:

scss 复制代码
    // enum可以和uint显式的转换
    function enumToUint() external view returns(uint){
        return uint(action);
    }

enum是一个比较冷门的变量,几乎没什么人用。

在remix上验证

  • 部署合约后可以查看每个类型的变量具体的数值

  • enum和uint转换的示例

总结

在这一讲,我们介绍了solidity中4种变量类型,并详细介绍了数值变量(value type)中的布尔型,整型,地址,定长字节数组和枚举。之后我们会介绍其他几种类型。

微信公众号:

B站:B站Web3学院

组建了一个Solidity共学营, 大家有兴趣跟着我一起学的 可以加我的微信 panyongxuzero , 备注: Solidity共学

Solidity 共学营2:

相关推荐
-代号9527几秒前
【JavaScript】十四、轮播图
javascript·css·css3
树上有只程序猿24 分钟前
后端思维之高并发处理方案
前端
庸俗今天不摸鱼1 小时前
【万字总结】前端全方位性能优化指南(十)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
前端·性能优化·webassembly
QTX187301 小时前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
黄毛火烧雪下1 小时前
React Context API 用于在组件树中共享全局状态
前端·javascript·react.js
Apifox1 小时前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
一张假钞1 小时前
Firefox默认在新标签页打开收藏栏链接
前端·firefox
高达可以过山车不行1 小时前
Firefox账号同步书签不一致(火狐浏览器书签同步不一致)
前端·firefox
m0_593758101 小时前
firefox 136.0.4版本离线安装MarkDown插件
前端·firefox
掘金一周1 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端