3.4 什么是不同的数据类型

Solidity是一种静态类型语言,变量存储的数据类型需要预先定义。所有变量默认值都是0。在Solidity中,变量是有函数作用范围的,也就是说,在函数中任何地方声明的变量将对整个函数存在适用范围,无论它是在哪里声明的。

现在让我们看看Solidity提供的不同数据类型:

·最简单的数据类型是布尔值,可以是true或者false。

·uint8,uint16,uint24,…,uint256分别用于存储无符号的8位,16位,24 位,…,256位整数。同理,int8,int16,…,int256分别用于存储8位,16位,24位,…,256位整数。uint和int是 uint256和int256的别名。类似于uint和int,ufixed和fixed代表分数。 ufixed0x8,ufixed0x16,…,ufixed0x256分别用于存储未签名的8位,16位,24位,…,256位分数。同 理,fixed0x8,fixed0x16,…,fixed0x256分别用于存储8位,16位,24位,…,256位分数。如果一个数字超过256位, 则使用256位数据类型存储该数字的近似值。

·address可以用于存储最大20字节的值(十六进制表示)。它用于存储以太坊地址。address类型有两个属 性:balance和send。balance用于检测地址余额,send用于向地址发送以太币。send方法拿出需要转账那些数量的wei,并根据转账 是否成功返回true或者false。wei从调用send方法的合约中扣除。用户可以在Solidity中使用0x前缀给变量分配一个十六进制的数值。

3.4.1 数组类型

Solidity支持generic和byte两种数组类型。它们支持固定长度和动态长度两种数组,也支持多维数组。

bytes1,bytes 2,bytes3,……,bytes32是字节数组的类型。byte是bytes 1的别名。

下面给出了generic数组语法的一个示例:

image.png

关于数组的重要内容如下:

·数组还有length属性,用于发现数组的长度。用户还可以给length属性分配一个值,以改变数组大小,但不可以在内存中改变数组大小,也不可以改变非动态数组大小。

·如果想访问动态数组的未设置索引(unset index),会抛出异常。

记住:array、structs和map都不可以用作函数参数,也不可以用作函数返回值。

3.4.2 字符串类型

在Solidity中,有两种方法创建字符串:使用bytes和string。bytes用于创建原始字符串,而string用于创建UTF-8字符串。字符串长度总是动态的。

下面给出了字符串语法的一个示例:

image.png

3.4.3 结构类型

Solidity还支持结构类型(struct)。下面给出了struct语法的一个示例:

image.png

注意:函数参数不可以是结构类型,且函数不可以返回结构类型。

3.4.4 枚举类型

Solidity还支持枚举类型(enum)。下面给出了enum语法的一个示例:

image.png

3.4.5 mapping类型

mapping数据类型是一个哈希表。mapping类型只可以存在于storage中,不存在于memory中,因 此它们是作为状态变量声明的。可以认为mapping类型包含key/value对,不是实际存储key,而是存储key的keccak256哈希,用于 查询value。mapping类型没有长度。mapping不可以被分配给另一个mapping。

下面给出了一个创建和使用mapping的示例:

image.png

记住:如果想访问mapping中不存在的key,返回的value均为0。

3.4.6 delete操作符

delete操作符可以用于任何变量,将其设置成默认值。默认值均为0。

如果对动态数组使用delete操作符,则删除所有元素,其长度变为0。如果对静态数组使用delete操作符,则重置所有索引。还可以通过对特定索引位置使用delete来重置索引。

如果对map类型使用delete操作符,什么都不会发生。但是如果对map类型的一个键使用delete操作符,则会删除与该键相关的值。

下面给出了delete操作符的一个示例:

image.png

image.png

3.4.7 基本类型之间的转换

除了数组类型、字符串类型、结构类型、枚举类型和map类型外,其他类型均称为基本类型。

如果把一个操作符应用于不同的类型,编译器将尝试把一个操作数隐式转换为另一种类型。通常来说,如果没有语义信息丢 失,值和类型之间可以进行隐式转换:uint8可转换为uint16,int128可转换为int256,但是int8不可转换为uint256(因为 uint256不能存储,例如-1)。此外,无符号整数可以转换成同等大小或者更大的字节,但是反之则不然。任何可以转换成uint160的类型都可以转 换成地址。

Solidity也支持显式转换。所以,如果编译器不允许在两种数据类型之间隐式转换,则可以进行显式转换。建议尽量避免显式转换,因为可能返回难以预料的结果。

来看一个例子:

image.png

这里是将uint32类型显式转换为uint16,也就是说,把较大类型转换为较小类型,因此高位被砍掉了。

3.4.8 使用var

Solidity提供了用于声明变量的var关键字。变量类型根据分配给它的第一个值来动态确定。一旦分配了值,类型就固定了,所以如果给它指定另一个类型,将引起类型转换。示例如下:

image.png

记住:在定义数组array和map时不能使用var。var也不能用于定义函数参数和状态变量。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=580

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值