Solidity是一种静态类型的编程语言,其基本数据类型可以分为以下几类:

1、布尔型(Booleans):布尔型变量有两个值,truefalse。Solidity支持常见的布尔运算符,如!(非)、&&(与)、||(或)等。

bool isReady = true;

2、整型(Integers):整型分为有符号整型int和无符号整型uint。整数类型可以有不同的位宽,如int8int16int256,其中后缀表示其位宽。默认情况下,intuint分别是int256uint256的别名。

这里以int8为例子

(1)位宽:int8的位宽为8位。这意味着它可以表示的整数范围是从-2^(8-1)(即-128)到2^(8-1) - 1(即127)。

(2)有符号:int8是有符号整数类型,意味着它可以表示正数、负数和零。如果需要表示0到255范围内的正整数,可以使用无符号整数类型uint8

(3)运算:int8支持常见的整数运算,包括加法(+)、减法(-)、乘法(*)、除法(/)和求模(%)。此外,还支持位运算(如按位与&、按位或|、按位异或^、按位取反~、左移<<和右移>>)和比较运算(如等于==、不等于!=、大于>、小于<、大于等于>=和小于等于<=)。

(4)溢出:在进行算术运算时,要注意整数溢出的问题。Solidity 0.8.0及更高版本默认会在整数溢出或下溢时抛出异常。对于早期版本的Solidity,建议使用SafeMath库来防止整数溢出。Solidity 0.8.7是一个比较稳定的版本

uint256 age = 30;
int8 score = -10;

3、地址(Addresses):address类型表示eth地址。此类型有一些内置方法,如transfer(发送以太币)、balance(查询余额)等。

address owner = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;

4、定长字节数组(Fixed-size byte arrays):定长字节数组用于表示特定长度的字节序列。类型为bytes1bytes32

bytes32 hash = 0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef;

6、动态字节数组(Dynamically-sized byte arrays):动态字节数组用于表示可变长度的字节序列。类型为bytesstring

bytes data;
string message = "Hello, world!";

在Solidity中,string类型是动态长度的字节数组(bytes类型的别名)。string类型的大小并不固定,它可以根据实际存储的字符串长度进行调整。字符串中的每个字符占用一个字节,因此string类型的位数(bit size)取决于字符串的长度。

例如,长度为5个字符的字符串将占用5 * 8 = 40位。但请注意,Solidity使用UTF-8编码来处理字符串,因此对于需要多个字节表示的字符(如某些特殊符号、表情符号或其他Unicode字符),实际占用的位数可能会更多。

在Solidity中,字符串存储在EVM的内存(memory)和存储(storage)中。字符串长度的变化会影响合约的Gas消耗,因为更长的字符串会占用更多的存储空间。在处理字符串时,务必注意优化数据存储和操作以节省Gas成本。

bytesstring在某些方面是等效的,但它们也有一些关键区别。它们都是动态大小的字节数组,可以在Solidity中表示任意长度的数据。然而,它们的关键区别在于它们的预期用途和编码。

  1. bytesbytes类型用于表示任意的字节数据,它没有特定的编码。bytes类型适用于处理原始字节数据,例如二进制文件、哈希值或序列化数据。在处理bytes数据时,没有字符编码的概念,因此不能直接将其视为文本。
  2. stringstring类型用于表示UTF-8编码的字符串数据。string类型适用于处理文本数据,可以表示各种语言的字符。在处理string数据时,需要考虑字符编码,因为每个UTF-8字符可能占用不同数量的字节。

在很多场景中,bytesstring可以互换使用,尤其是当数据表示和编码不是关键因素时。然而,在处理特定类型的数据时,使用适当的类型(bytes用于字节数据,string用于字符串数据)可以提高代码的可读性和可维护性。

需要注意的是,在合约中使用bytesstring类型的动态数组时,它们的Gas成本可能会较高,因为存储和操作动态数组需要额外的开销。在可能的情况下,优先考虑使用固定长度的字节数组(例如bytes32)以降低Gas成本。

7、枚举(Enums):枚举用于表示预定义的值集合。枚举类型需要在合约中单独声明。

enum State { Created, Locked, Inactive }
State public currentState = State.Created;

8、数组(Arrays):数组可以是定长或动态长度。数组元素可以是任意类型,包括其他数组。

uint256[] public dynamicArray;
uint256[5] fixedArray;

9、结构体(Structs):结构体是一种自定义类型,允许你创建更复杂的数据结构。

struct Player {
    address playerAddress;
    uint256 level;
    uint256 experience;
}
Player public player1 = Player(0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c, 1, 0);

10、映射(Mappings):映射是一种哈希表数据结构,将键类型映射到值类型。映射的键和值类型可以是任意类型,除了映射本身。

mapping(address =>uint256) public balances;

mapping(uint256 => Player) public players;