智能合约语言 Solidity 类型介绍

想知道更多区块链技术相关问题,请百度【链客区块链技术问答社区】

Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,毕竟如果你不是很了解的话,未必知道本篇是讲的什么,So,萌新就不要来看了,很高深哦~哈哈,开个小玩笑。

类型
Solidity是一种静态类型的语言,也就是说需要在编译时指定变量的类型,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约。其可以提供基础的来组合成复杂的类型。
Solidity类型分为两类:
1.值类型: 变量在赋值或传参时,总是进行值拷贝。
2.引用类型
值类型(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)
1
布尔类型(Booleans)
布尔(bool):可能的取值为常量值true和false。
布尔类型支持的运算符有:
!逻辑非
&& 逻辑与
|| 逻辑或
== 等于
!= 不等于
注意:运算符&&和||是短路运算符,如f(x)||g(y),当f(x)为真时,则不会继续执行g(y)。

整型(Integers)
int/uint: 表示有符号和无符号不同位数整数。支持关键字uint8 到 uint256 (以8步进),
uint 和 int 默认对应的是 uint256 和 int256。
支持的运算符:
比较运算符: <=, < , ==, !=, >=, > (返回布尔值:true 或 false)
位操作符: &,|,^(异或),~(位取反)
算术操作符:+,-,一元运算-,一元运算+,,/, %(取余数), (幂), << (左移位), >>(右移位)
说明:
整数除法总是截断的,但如果运算符是字面量(字面量稍后讲),则不会截断。
整数除0会抛异常。
移位运算的结果的正负取决于操作符左边的数。x << y 和 x 2
y 是相等, x >> y 和 x / 2**y 是相等的。
不能进行负移位,即操作符右边的数不可以为负数,否则会抛出运行时异常。
注意:Solidity中,右移位是和除等价的,因此右移位一个负数,向下取整时会为0,而不像其他语言里为无限负小数。
有理数和整型常量(Rational and Integer Literals)
也有人把Literals翻译为字面量
整型常量是有一系列0-9的数字组成,10进制表示,比如:8进制是不存在的,前置0在Solidity中是无效的。
10进制小数常量(Decimal fraction literals)带了一个., 在.的两边至少有一个数字,有效的表示如:1., .1 和 1.3.
科学符号也支持,基数可以是小数,指数必须是整数, 有效的表示如: 2e10, -2e10, 2e-10, 2.5e1。
数字常量表达式本身支持任意精度,也就是可以不会运算溢出,或除法截断。但当它被转换成对应的非常量类型,或者将他们与非常量进行运算,则不能保证精度了。
如:(2800 + 1) - 2800的结果为1(uint8整类) ,尽管中间结果已经超过计算机字长。另外:.5 * 8的结果是4,尽管有非整形参与了运算。
只要操作数是整形,整型支持的运算符都适用于整型常量表达式。
如果两个操作数是小数,则不允许进行位运算,指数也不能是小数。
注意:
数字常量表达式,一旦其中含有常量表达式,它就会被转为一个非常量类型。下面代码中表达式的结果将会被认为是一个有理数:
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);
}

}

猜你喜欢

转载自blog.csdn.net/weixin_44172023/article/details/85989517
今日推荐