Solidity 数据类型

admin
admin 2019年08月09日
  • 在其它设备中阅读本文章

一、类型

Solidity 是一种静态类型语言,这意味着每个变量(状态变量和局部变量)都需要在编译时指定变量的类型。
Solidity 提供了几种基本类型,并且基本类型可以用来组合出复杂类型。
新声明的变量总是有一个 默认值 ,具体的默认值跟类型相关。
数据类型可分为 值类型 引用类型

二、值类型

当这些变量被用作函数参数或者用在赋值语句中时,总会进行 值传递

  • 布尔类型:bool ,可能的取值为字面常量值 true 和 false
  • 整型:int / uint ,分别表示有符号和无符号的不同位数的整型变量。 支持关键字 uint8 到 uint256 ,以及 int8 到 int256,以 8 位为步长递增。 uint 和 int 分别是 uint256 和 int256 的别名
  • 地址类型:address,160 位,所以可以用一个 uint160 编码。地址是所有合约的基础,所有的合约都会继承地址对象
  • 定长字节数组:bytes1, ... ,bytes32,允许值以步长 1 递增。byte 默认表示 byte1
  • 枚举类型:enum,用户自定义类型。他可以显示的转换与整数进行转换,但不能进行隐式转换
  • 函数:function,可以将一个函数赋值给另一个函数类型的变量,也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量

三、引用类型

复杂类型,占用空间较大的。在拷贝时占用空间较大。所以考虑通过引用传递。常见的引用类型有:

  • 不定长字节数组:bytes,是特殊的数组, 类似于 byte[],但它在调用数据 calldata 和内存 memory 中会被“紧打包”
  • 字符串:string,与不定长字节数组 bytes 相同,但不允许用长度或索引来访问
  • 数组:array,一个元素类型为 T,固定长度为 k 的数组可以声明为 T[k],而动态数组声明为 T[]
  • 结构体:strut,由一些数据类型复合而成的自定义类型,不能声明一个 struct 同时将这个 struct 作为这个 struct 的一个成员
  • 映射 / 字典,mappings,一种键值对的映射关系存储结构。定义方式为 mapping(_KeyType => _KeyValue)。键的类型允许除映射外的所有类型,如数组,合约,枚举,结构体。值的类型无限制

四、类型转换

1、隐式转换

如果一个运算符用在两个不同类型的变量之间,那么编译器将隐式地将其中一个类型转换为另一个类型(不同类型之间的赋值也是一样)。 一般来说,只要值类型之间的转换在语义上行得通,而且转换的过程中没有信息丢失,那么隐式转换基本都是可以实现的: uint8 可以转换成 uint16,int128 转换成 int256,但 int8 不能转换成 uint256 (因为 uint256 不能涵盖某些值,例如,-1)。 更进一步来说,无符号整型可以转换成跟它大小相等或更大的字节类型,但反之不能。

2、显式转换

如果某些情况下编译器不支持隐式转换,但是你很清楚你要做什么,这种情况可以考虑显式转换。 注意这可能会发生一些无法预料的后果,因此一定要进行测试,确保结果是你想要的! 一般为:typeA x = typeB(y);