1. 基本数据类型
1.1 整数类型
Solidity支持有符号整数和无符号整数,可以指定位数和范围。以下是一些整数类型的示例:
int:有符号整数,可以是正数或负数。2,-45,2023
uint:无符号整数,只能是正数。2,6,2022
int8、int16、int32、int64、int128:有符号整数,指定位数。
uint8、uint16、uint32、uint64、uint128:无符号整数,指定位数。
这里的知识和普通的编程语言类似,比如int8就代表最大能够存储一个8位的整数,它的范围也就是-128 到127(-2^7 到 2^7-1)。其中一个比特用来表示符号(正或负),而其他7个比特用来表示整数值。这使得 int8 可以表示2^7(128)个不同的整数值,分别对应于 -128 到 127。基础的知识就不再赘述了。为什么solidity中对于这种数据类型有着如此精细的划分呢?因为在执行合约的时候是需要消耗gas的,占用不用的为就意味着执行需要消耗不同的gas,因此我们在使用的时候有必要根据自己存储的数字的范围来选取最合适的类型。
在remix上写一个合约:
ctrl + s编译后,部署运行:
public修饰的属性我们可以直接查看,具体的修饰符后面详细说明。注意solidity中的hash操作,authorHash = keccak256(abi.encode(_name, _age, _sal));
1.2 布尔类型、地址类型
bool,表示真或假,true or false。这里就不用再多说了。
地址类型是不是和我们平时的c里面的地址一样呢?并不是的,在silidity中的地址类型address,用于存储Ethereum地址。可以包含合约地址或外部账户地址。也就是这个地址类型就像是代表了我们的银行卡号。比如:0xcb76b7d9a3458ef540ade6068dfe2f44e8ff745f
1.3 string、bytex、bytes、byte
string 用于文本数据,bytex 用于固定大小的字节数组,申明的时候在后面跟上数字表示位数,而 bytes 用于动态大小的字节数组,而byte就表示字节类型,用于存储一个字节。这些数据类型在智能合约中用于存储和处理不同种类的数据,根据需要选择适当的类型。需要注意的是,合约中的数据存储和操作都需要谨慎处理,以避免安全问题和不必要的消耗。
2. 复合类型
2.1 结构体
在Solidity中,结构体(Struct)是一种用户自定义的数据类型,用于将多个不同类型的变量组合成一个单一的数据结构。结构体允许你创建具有多个字段的自定义数据类型,用于表示复杂的数据记录。
定义:
struct Person {
string name;
uint age;
}
实例化:
Person public alice = Person("Alice", 30);
Person public bob;
bob.name = "Bob";
bob.age = 25;
2.2 数组
solidity的数组和其他语言的数组很类似,Solidity 支持不同类型的数组,包括静态数组和动态数组。静态数组具有固定大小,而动态数组的大小可以在运行时动态分配。
静态数组:type[size],其中 type 表示数组中元素的数据类型,而 size 表示数组的大小。
// uint[5] public staticArray; // 具有5个整数元素的静态数组
动态数组的大小不是在声明时确定的,可以在运行时动态添加或删除元素。它的声明形式为 type[]。
uint[] public dynamicArray; // 动态整数数组
数组支持各种操作和属性,包括 .push() 用于在动态数组的末尾添加元素,.length 用于获取数组的长度,以及索引访问等。
动态数组的元素可以通过索引进行访问,如 dynamicArray[0]
结构体数组
struct Person {
string name;
uint age;
}
Person[] public people; // 包含自定义结构体的动态数组
solidity也支持多维数组:uint[][3] public twoDimensionalArray; // 二维整数数组,包含3个子数组