最新内容会更新在主站深入浅出区块链社区
原文链接:智能合约语言 Solidity 教程系列1 - 类型介绍

现在的Solidity中文文档,要么翻译的太烂,要么太旧,决定重新翻译下。

写在前面

Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解。
Solidity语法的介绍会是一系列文章,本文是第一篇:介绍Solidity的变量类型。

本文前半部分是参考Solidity官方文档(当前最新版本:0.4.20)进行翻译,前半部分是实际合约代码实例说明类型的使用。

类型

Solidity是一种静态类型语言,意味着每个变量(本地或状态变量)需要在编译时指定变量的类型(或至少可以推倒出类型)。Solidity提供了一些基本类型可以用来组合成复杂类型。

Solidity类型分为两类:

  • 值类型(Value Type) - 变量在赋值或传参是,总是进行值拷贝。
  • 引用类型(Reference Types)

值类型(Value Type)

值类型包含:

  • 布尔类型(Booleans)
  • 整型(Integers)
  • 定长浮点型(Fixed Point Numbers)
  • 定长字节数组(Fixed-size byte arrays)
  • 有理数和整型常量(Rational and Integer Literals)
  • 字符串常量(String literals)
  • 十六进制常量(Hexadecimal literals)
  • 枚举(Enums)
  • 函数(Function Types)
  • 地址(Address)
  • 地址常量(Address Literals)

函数和地址讲解会在之后的文章。

布尔类型(Booleans)

布尔(bool):可能的取值为常量值truefalse

布尔类型支持的运算符有:

  • !逻辑非
  • && 逻辑与
  • || 逻辑或
  • == 等于
  • != 不等于

注意:运算符**&&||**是短路运算符,如f(x)||g(y),当f(x)为真时,则不会继续执行g(y)。

整型(Integers)

int/uint: 表示有符号和无符号不同位数整数。支持关键字uint8uint256 (以8步进),
uintint 默认对应的是 uint256int256

支持的运算符:

  • 比较运算符: <=, < , ==, !=, >=, > (返回布尔值:true 或 false)
  • 位操作符: &,|,^(异或),~(位取反)
  • 算术操作符:+,-,一元运算-,一元运算+,*,/, %(取余数), ***(幂), << (左移位), >>(右移位)

说明:

  1. 整数除法总是截断的,但如果运算符是字面量(字面量稍后讲),则不会截断。
  2. 整数除0会抛异常。
  3. 移位运算的结果的正负取决于操作符左边的数。x << y 和 x * 2***y 是相等, x >> y 和 x / 2**y 是相等的。
  4. 不能进行负移位,即操作符右边的数不可以为负数,否则会抛出运行时异常。

注意:Solidity中,右移位是和除等价的,因此右移位一个负数,向下取整时会为0,而不像其他语言里为无限负小数。

定长浮点型(Fixed Point Numbers)

注意:定长浮点型 Solidity(发文时)还不完全支持,它可以用来声明变量,但不可以用来赋值。

fixed/ufixed: 表示有符号和无符号的固定位浮点数。关键字为ufixedMxNufixedMxN
M表示这个类型要占用的位数,以8步进,可为8到256位。
N表示小数点的个数,可为0到80之前

支持的运算符:

  • 比较运算符: <=, < , ==, !=, >=, > (返回布尔值:true 或 false)
  • 算术操作符:+,-,一元运算-,一元运算+,*,/, %(取余数)
    注意:它和大多数语言的float和double不一样,M是表示整个数占用的固定位数,包含整数部分和小数部分。因此用一个小位数(M较小)来表示一个浮点数时,小数部分会几乎占用整个空间。

定长字节数组(Fixed-size byte arrays)

关键字有:bytes1, bytes2, bytes3, …, bytes32。(以步长1递增)
byte代表bytes1。

支持的运算符:

  • 比较符: <=, <, ==, !=, >=, > (返回bool)
  • 位操作符: &, |, ^ (按位异或),~(按位取反), << (左移位), >> (右移位)
  • 索引(下标)访问: 如果x是bytesI,当0 <= k < I ,则x[k]返回第k个字节(只读)。

移位运算和整数类似,移位运算的结果的正负取决于操作符左边的数,且不能进行负移位。

成员变量:
.length:表示这个字节数组的长度(只读)。

变长(动态分配大小)字节数组(Dynamically-sized byte array)

  • bytes:动态分配大小字节数组, 参见Arrays,不是值类型!
  • string:动态分配大小UTF8编码的字符类型,参看Arrays。不是值类型!

根据经验:
bytes用来存储任意长度的字节数据,string用来存储任意长度的(UTF-8编码)的字符串数据。
如果长度可以确定,尽量使用定长的如byte1到byte32中的一个,因为这样更省空间。

有理数和整型常量(Rational and Integer Literals)

也有人把Literals翻译为字面量

整型常量是有一系列0-9的数字组成,10进制表示,比如:8进制是不存在的,前置0在Solidity中是无效的。

10进制小数常量(Decimal fraction literals)带了一个**., 在.**的两边至少有一个数字,有效的表示如:1., .11.3.

科学符号也支持,基数可以是小数,指数必须是整数, 有效的表示如: 2e10, -2e10, 2e-10, 2.5e1

数字常量表达式本身支持任意精度,也就是可以不会运算溢出,或除法截断。但当它被转换成对应的非常量类型,或者将他们与非常量进行运算,则不能保证精度了。
如:(2*800 + 1) - 2*800的结果为1(uint8整类) ,尽管中间结果已经超过计算机字长。另外:.5 * 8的结果是4,尽管有非整形参与了运算。

只要操作数是整形,整型支持的运算符都适用于整型常量表达式。
如果两个操作数是小数,则不允许进行位运算,指数也不能是小数。

注意:
Solidity对每一个有理数都有一个数值常量类型。整数常量和有理数常量从属于数字常量。所有的数字常表达式的结果都属于数字常量。所以1 + 2和2 + 1都属于同样的有理数的数字常量3

警告:
整数常量除法,在早期的版本中是被截断的,但现在可以被转为有理数了,如5/2的值为 2.5

注意:
数字常量表达式,一旦其中含有常量表达式,它就会被转为一个非常量类型。下面代码中表达式的结果将会被认为是一个有理数:

uint128 a = 1;
uint128 b = 2.5 + a + 0.5;

上述代码编译不能通过,因为b会被编译器认为是小数型。

字符串常量

字符串常量是指由单引号,或双引号引起来的字符串 (“foo” or ‘bar’)。字符串并不像C语言,包含结束符,"foo"这个字符串大小仅为三个字节。和整数常量一样,字符串的长度类型可以是变长的。字符串可以隐式的转换为byte1,…byte32 如果适合,也会转为bytes或string。

字符串常量支持转义字符,比如\n,\xNN,\uNNNN。其中\xNN表示16进制值,最终转换合适的字节。而\uNNNN表示Unicode编码值,最终会转换为UTF8的序列。

十六进制常量(Hexadecimal literals)

十六进制常量,以关键字hex打头,后面紧跟用单或双引号包裹的字符串,内容是十六进制字符串,如hex"001122ff"。
它的值会用二进制来表示。

十六进制常量和字符串常量类似,也可以转换为字节数组。

枚举(Enums)

在Solidity中,枚举可以用来自定义类型。它可以显示的转换与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。枚举类型应至少有一名成员。下面是一个枚举的例子:

pragma solidity ^0.4.0;contract test {enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }ActionChoices choice;ActionChoices constant defaultChoice = ActionChoices.GoStraight;function setGoStraight() {choice = ActionChoices.GoStraight;}// Since enum types are not part of the ABI, the signature of "getChoice"// will automatically be changed to "getChoice() returns (uint8)"// for all matters external to Solidity. The integer type used is just// large enough to hold all enum values, i.e. if you have more values,// `uint16` will be used and so on.function getChoice() returns (ActionChoices) {return choice;}function getDefaultChoice() returns (uint) {return uint(defaultChoice);}
}

代码实例

通过合约代码实例说明类型的使用,请前往区块链技术专栏查看。

参考文档

Solidity官方文档-类型

深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客

Solidity教程序列1 - 类型介绍相关推荐

  1. 智能合约语言Solidity 类型介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 智能合约语言Solidity 类型介绍11 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合 ...

  2. 智能合约语言 Solidity 教程系列9 - 错误处理

    这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文 ...

  3. 智能合约语言 Solidity 教程系列8 - Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里. <!-- more --> 写在前面 Solidity 是 ...

  4. 循环神经网络教程-第一部分 RNN介绍

    循环神经网络教程-第一部分 RNN介绍 循环神经网络(RNN)是非常流行的模型,它在许多NLP任务上都表现出了巨大的潜力.虽然它很流行,但是详细介绍RNN以及如何实现RNN的文章却很少.这篇教程旨在解 ...

  5. WPF入门教程系列四——Dispatcher介绍

    WPF入门教程系列四--Dispatcher介绍 一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还 ...

  6. 聊天机器人:问答系统类型介绍

    目录 聊天机器人:让机器更好的服务人 问答系统类型介绍 基于事实的问答系统 基于常见问题集的问答系统 开放域的问答系统 总结 聊天机器人:让机器更好的服务人 新的一天开始的时候,我们就会依赖机器,以前 ...

  7. 乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍(可供技术选型时使用)

    乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍 RabbitMQ介绍 1.RabbitMQ技术简介 2.RabbitMQ其他扩展插件 2.1监控工具rabbitmq-managemen ...

  8. WML教程2:简单介绍关于WML文件的概念WML Decks

    WML教程2:简单介绍关于WML文件的概念WML Decks 这里简单介绍一个关于WML文件的概念,其他的细节问题会在后面的章节还详细介绍. 声明 由于WML语言继承于XML,所以一个有效的WML文档 ...

  9. OpenGL教程 用2D图形介绍OpenGL

    OpenGL教程 用2D图形介绍OpenGL 1.设置OpenGL 要设置OpenGL,取决于您的编程平台,请阅读: 如何在C / C ++中编写OpenGL程序. 如何在Java中编写OpenGL程 ...

  10. mysql blob longblob_MYSQL教程Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)

    <MYSQL教程Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)>要点: 本文介绍了MYSQL教程Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理 ...

最新文章

  1. 句法分析应用领域及意义
  2. Superhero Battle
  3. 笔试算法题(28):删除乱序链表中的重复项 找出已经排好序的两个数组中的相同项...
  4. ERROR: Could not read unit serial number!
  5. Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs
  6. 如何看待事理图谱版magi--学迹
  7. Python中赋值,深拷贝和浅拷贝
  8. enablefeignclients 注解_Spring Boot 中 @EnableXXX 注解的驱动逻辑
  9. 课设2--线性表的操作
  10. 图:双屏前期设置方法[又名:系统扩展桌面设置方法-双屏双显扩展桌面技术前期设置方法-PPT分屏技术设置方法]
  11. Win 10 UEFI + Ubuntu 18.04 UEFI 双系统 (by quqi99)
  12. 数据库的内连接和外连接的区别
  13. 《电子元器件的可靠性》——第3章可靠性试验
  14. 沈阳农业大学计算机专业排名,沈阳农业大学王牌专业排名
  15. 同步锁Synchronized和ReentrantLock区别
  16. 华为云跨云迁移工具案例实践:阿里云迁移到华为云
  17. python实训day8
  18. Web3的流支付代表Zebec,熊市布局的价值逻辑
  19. 上线项目 Docker部署项目到服务器总结
  20. 如何修改机器码,怎么修改机器码,什么是机器码

热门文章

  1. JMeter下载和安装
  2. JMeter下载安装及入门教程
  3. 什么是串口?什么是并口?串口与并口有什么区别?-道合顺大数据Infinigo
  4. 词法分析器【编译原理】
  5. 删除无法读取源文件或磁盘的文件 删除系统找不到指定路径的文件
  6. mysql 判断语句_mysql条件判断语句讲解
  7. steam加速_玩转steam的新姿势:必备加速器推荐!
  8. 基于RGB-D图像的语义场景补全研究进展综述
  9. Perforce携手龙智成功举办2021年度中国用户大会助力中国企业“加速开发”
  10. office2010安装需MSXML版本6.10.1129.0详解解决方案