【从0学习Solidity】2. 值类型详解

2023-11-17

Solidity极简入门: 2. 值类型

在这里插入图片描述

  • 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。
  • 关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!
  • 本文收录于 不写代码没饭吃 的学习汇报系列,大家有兴趣的可以看一看。
  • 欢迎访问我们的微信公众号:不写代码没饭吃,获取更多精彩内容、实用技巧、行业资讯等。您关注的是我们前进的动力!

Solidity中的变量类型

  1. 值类型(Value Type):包括布尔型,整数型等等,这类变量赋值时候直接传递数值。

  2. 引用类型(Reference Type):包括数组和结构体,这类变量占空间大,赋值时候直接传递地址(类似指针)。

  3. 映射类型(Mapping Type): Solidity中存储键值对的数据结构,可以理解为哈希表

我们将仅介绍常用类型,不常用的类型不会涉及,本篇将介绍值类型。

值类型

1. 布尔型

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

    // 布尔值
    bool public _bool = true;

布尔值的运算符包括:

  • ! (逻辑非)
  • && (逻辑与,“and”)
  • || (逻辑或,“or”)
  • == (等于)
  • != (不等于)
    // 布尔运算
    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 中的整数,最常用的包括:

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

常用的整型运算符包括:

  • 比较运算符(返回布尔值): <=<==!=>=>
  • 算数运算符: +-*/%(取余),**(幂)
    // 整数运算
    uint256 public _number1 = _number + 1; // +,-,*,/
    uint256 public _number2 = 2**2; // 指数
    uint256 public _number3 = 7 % 2; // 取余数
    bool public _numberbool = _number2 > _number3; // 比大小

大家可以运行一下代码,看看这 4 个变量分别是多少。

3. 地址类型

地址类型(address)有两类:

  • 普通地址(address): 存储一个 20 字节的值(以太坊地址的大小)。
  • payable address: 比普通地址多了 transfersend 两个成员方法,用于接收转账。

我们会在之后的章节更加详细地介绍 payable address。

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

4. 定长字节数组

字节数组分为定长和不定长两种:

  • 定长字节数组: 属于值类型,数组长度在声明之后不能改变。根据字节数组的长度分为 bytes1, bytes8, bytes32 等类型。定长字节数组最多存储 32 bytes 数据,即bytes32
  • 不定长字节数组: 属于引用类型(之后的章节介绍),数组长度在声明之后可以改变,包括 bytes 等。
    // 固定长度的字节数组
    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

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

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

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

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

在 Remix 上运行

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

在这里插入图片描述

  • enumuint 转换的示例:
    在这里插入图片描述

在这里插入图片描述

总结

在这一讲,我们介绍了 Solidity 中值类型,包括布尔型、整型、地址、定长字节数组和枚举。在后续章节,我们将继续介绍 Solidity 的其他变量类型,包括引用类型和映射类型。

在这里插入图片描述

如果这份博客对大家有帮助,希望各位给作者一个免费的点赞

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【从0学习Solidity】2. 值类型详解 的相关文章

  • 三维旋转:旋转矩阵,欧拉角,四元数

    在介绍下面的文章前 大家如果接触到欧拉角的话 就一定要关注一个词 要顺规 在欧拉角体系里面 有12种顺规 这一点是好多文章没有让读书意识到 导致后面学习图形学里面的 heading pitch bank 时对不上号 一般百度百科里面说到的

随机推荐

  • 课程笔记2

    一 实现 1 区块链是去中心化的账本 比特币采用的是基于交易的账本模式 区块链的全节点需要维护一种名叫UTXO的数据结构 所有未花掉的交易的输出的集合 可以有效检测双花攻击 交易的总输入略微大于总输出 这是因为比特币的第二个激励机制 获得记
  • load data inpath出错原因及解决方法

    hive gt load data inpath hdfs Master hdp 9000 person txt into table Person1 FAILED SemanticException Error 10028 Line 1
  • java setcellvalue NA_java minioClient.setBucketPolicy 调用失败 折腾好几天了 求大佬解惑...

    方法调用后 提示 Request processing failed nested exception is java lang IllegalArgumentException unknown error code string Malf
  • 简要损益科目口诀,营业外收支和其他业务收支的区别

    一 损益科目口诀 三收三费所得税 两成三益外加减 三收 主营业务收入 其他业务收入 营业外收入 三费 管理费用 财务费用 销售费用 这是常用费用 某些企业可能还分有研究开发费用 两成 主营业务成本 其他业务成本 三益 投资收益 公允价值变动
  • java查看包的源代码

    把鼠标放在方法上 按Ctrl进去 打开的 class文件就是Java jdk1 7 0 src zip中的源码 但是在Java jdk1 7 0 src zip 中是以 java为扩展名
  • ios开发教程入门到精通

    第1集 初识macOS 点击观看 第2集 开发工具Xcode 点击观看 第3集 初识Objective C 点击观看 待续
  • 华为机试 牛客网 HJ1 字符串最后一个单词的长度

    华为机试 牛客网 HJ1 字符串最后一个单词的长度 描述 输入描述 输出描述 示例一 解法一 解法二 反思 描述 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 输入描述 输入一行 代表要计算的字符串 非空 长度小于5
  • shell简单脚本编写

    1 第一步 安装邮件服务 root server yum install s nail y 第二步 编辑配置文件 root server vim etc s nail rc set from 自己的qq邮箱地址 set smtp smtp
  • OpenCV - 基本知识

    1 读取并显示图片 namedWindow新建一个显示窗口 imshow输出图片 namedwindow可有可无 Mat image cv imread E 其他文档 图片 2 jpg 2 cv namedWindow 照片 CV WIND
  • window中gcc编译程序、编辑环境配置以及gcc编译程序的过程(含system函数以及CMD快捷键)

    1 system函数的使用 include
  • 关于rocketmq 中日志文件路径的配置

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 rocketmq 中的数据和日志文件默认都是存储在user home路径下面的 往往我们都需要修改这些路径到指定文件夹以便管理 服务端日志 网
  • ML-朴素贝叶斯

    参考 西瓜书 P151 以前对贝叶斯参数的计算过程不是很清楚 在西瓜书里讲的很详细 原来可以把X属性分为离散型与连续型 离散型的话可以直接按照频率计算 连续型的话 要用极大似然估计 首先假设概率密度函数满足一个分布 比如正态分布 然后利用已
  • 动态控制ToolStrip上ToolStripButton的大小(包括图标的大小)

    一 设置固定大小的ToolStripButton 设置固定大小的ToolStripButton很简单 ToolStripButton gt AutoSize属性设置为false size调整为自己想要的大小即可 同时配合的是ToolStri
  • Flutter与android原生通信

    Flutter 与 Android iOS 之间信息交互通过 Platform Channel 进行桥接 Flutter 定义了三种不同的 Channel 但无论是传递方法还是传递事件 其本质上都是数据的传递 MethodChannel 用
  • 因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效......,请慎用

    作者 浪漫先生 出处 juejin im post 5f159cd8f265da22e425f71d 背景 我们项目中的抢购订单采用的是分布式锁来解决的 有一次 运营做了一个飞天茅台的抢购活动 库存 100 瓶 但是却超卖了 要知道 这个地
  • 在C++11通过SFINAE机制实现静态检查类成员是否存在并分情况处理,以及一种通用宏的实现

    目录 引入 目的 代码 测试 TIPS 引入 c 模板中 我们无法知道参数类是否具有某个成员 例如下面代码 我们希望下面的代码中能够打印t的成员变量a的值 然而当类型T不包含成员a时 调用下面的代码就会报错 template
  • iOS Push详述,了解一下?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由WeTest质量开放平台团队发表于云 社区专栏 作者 陈裕发 腾讯系统测试工程师 商业转载请联系腾讯WeTest获得授权 非商业转载请注明出处 原文链接 http wetest
  • 安装eli5库的踩雷

    报错方法 在Anaconda Prompt中输入pip install eli5 conda install eli5指令 分别显示安装失败和未找到包 解决方法 在Anaconda Powershell Prompt中输入conda ins
  • 深度学习中的优化算法之RMSProp

    之前在https blog csdn net fengbingchun article details 124766283 中介绍过深度学习中的优化算法AdaGrad 这里介绍下深度学习的另一种优化算法RMSProp RMSProp全称为R
  • 【从0学习Solidity】2. 值类型详解

    Solidity极简入门 2 值类型 博主简介 不写代码没饭吃 一名全栈领域的创作者 专注于研究互联网产品的解决方案和技术 熟悉云原生 微服务架构 分享一些项目实战经验以及前沿技术的见解 关注我们的主页 探索全栈开发 期待与您一起在移动开发