Solidity 数据类型:有符号整数 (int) 和无符号整数 (uint)

2025 年 5 月 27 日 | 阅读 8 分钟

Solidity 是一种高级的、面向对象的语言,用于在以太坊区块链网络上创建智能合约。 它是专门为利用 EVM 而开发的。由于它是一种静态类型编程语言,开发者必须在编译时声明智能合约变量的结构和数据类型。

如果您想精通 Solidity 语言,理解数据类型也很重要。Solidity 为智能合约提供了广泛的数据类型(例如整数、字符串、布尔值、数组、结构体等)。这有助于开发者满足更广泛的受众,应对各种类型的输入查询。

本教程将涵盖 Solidity 中的数据类型,并简要讨论常见的整数类型,即有符号 (int) 和无符号 (uint) 整数。

涵盖的主题

  1. 什么是 Solidity 数据类型?
  2. 什么是值类型?
  3. 什么是引用类型?
  4. 什么是符号整数 (int)?
  5. 什么是无符号整数 (uint)?
  6. 符号整数和无符号整数的区别
  7. 结论

什么是 Solidity 数据类型?

与其他的面向对象编程语言不同,Solidity 中的数据类型指定了存储在变量中的数据。 它提供了关于值或内存位置的引用地址的信息。Solidity 为智能合约提供了多种数据类型以供使用。这有助于它们满足更广泛的受众,应对各种类型的输入查询。

Solidity 数据类型大致可分为以下两类:

  1. 值类型
  2. 引用类型。

什么是值类型?

Solidity 值类型是存储在给定内存空间中的变量,并在任何函数或子合约调用相同数据类型时传递复制的值。使用值类型变量的好处是它持有变量的副本,因此,如果程序员对复制的值进行了任何更改,也不会影响原始数据值。

在 Solidity 中,值类型大致分为八类。

  • 符号/无符号整数
  • 布尔值,
  • 定点数
  • String
  • 解决
  • 字节数组
  • 字面量
  • Enums
  • 合约和函数类型。

让我们逐一快速了解它们。

  1. 符号/无符号整数 - 整数是没有分数或小数部分的数字。它代表整数数据类型,用于存储整个数字。这些可以是正数、负数,甚至是存储非负值的无符号整数。它们使用 int 和 unit 关键字声明。这些变量可用于算术、比较和按位运算符。
  2. 布尔值 - 布尔数据类型只能包含两个值:True 或 False。在 Solidity 中,布尔数据类型使用 bool 关键字声明。这些变量可用于比较和按位运算符。
  3. 定点数 - 在 Solidity 中,小数使用定点数声明。与其他编程语言不同,定点数在 Solidity 智能合约中尚未完全支持。
  4. 字符串 - 字符串值是存储在字节数组中的字母数字值。字符串字面量是包含在单引号或双引号中的值。它们用 string 关键字表示。
  5. 地址 - Solidity 提供 address 和 address payable 变量来存储 20 位地址。在 Solidity 中,地址后面会加上 "payable" 关键字。address payable 变量可以使用两种方法转账和接收以太币:
    • Balance:此方法返回以 Wei 为单位的地址余额。
    • Transfer:此方法将指定金额转账到收款人地址。
  6. 字节数组 - Bytes 是可以包含 1 到 32 位 ASCII 字符的数组。在 Solidity 智能合约中,它使用 "bytes" 关键字声明。它们表示为 bytes1、bytes2、bytes16 等。可以对这些变量执行比较、位运算和移位运算。
  7. 字面量 - 字面量被定义为可以存储在变量中的不可变类型。例如,整数、字符串、地址、有理数、十六进制数等。
  8. 枚举 - Enums(Enumerables 的缩写)是用户定义的类型,使用 Solidity 中的 Enum 定义。枚举至少需要一个参数,最多可以有 256 个参数。
  9. 智能合约和函数 - 在 Solidity 中,智能合约和函数类型用于表示合约及其指示性函数。

什么是引用类型?

Solidity 中的引用类型被定义为存储数据内存地址而不是实际数据的变量。值类型和引用类型之间的区别在于,值类型存储数据类型的值,而引用类型不存储任何值,而是指向目标数据的内存地址。

引用类型大致分为以下四类:

  1. 固定数组 - 数组是一种由数据集合组成的数据结构。数组有两种类型:定长数组和动态数组。固定大小的数组在其声明时预先定义。
  2. 动态数组 - 动态数组在运行时根据您 Solidity 智能合约所需的特定数据大小动态分配空间。
  3. 结构体 - 结构体 (struct) 是一种用于存储一组不同类型数据的容器。结构体可以包含枚举作为成员。结构体的变量的引用方式与对象的变量的引用方式相同。
  4. 映射 - 映射用于将键值对绑定在一起。映射声明为 Mapping(Keytype => ValueType)。KeyType 可以是除动态大小数组、合约、枚举或结构体之外的任何类型。ValueType 可以是任何类型,包括另一个映射。

什么是符号整数 (int)?

有符号整数使用 int 关键字在 Solidity 智能合约中定义。 顾名思义,它存储正值或负值,范围从 -2 的 255 次方到 2 的 255 次方 - 1。‍

Solidity 整数大小

整数数据值,可以存储多达 256 位整数或数据单元。例如:int8, int16, int32, int64, int128 和 int256。

语法

让我们在 Solidity 智能合约中理解符号整数的概念。

程序:在下面的示例中,我们声明了一个名为 SignedIntegerExample1 的智能合约,以展示符号整数的概念以及如何在 Solidity 智能合约中实现它。

输出

Solidity Data Types: Signed (int) and Unsigned Integers (uint)

说明

仅当您希望变量具有负值时才使用符号整数。因为符号整数在 Solidity 中占用更多空间,所以在以太坊区块链网络上部署智能合约时会消耗更多的 Gas 费。

什么是无符号整数 (uint)?

无符号整数使用 int 关键字在 Solidity 智能合约中定义。 它与符号整数相反,因为它存储一个大于或等于零的整数值,范围从 0 到 2 的 255 次方 - 1。它比符号整数占用更少的存储空间。

语法

程序 1:在下面的示例中,我们声明了一个名为 UnsignedIntegerExample1 的智能合约,以展示无符号整数 (unit) 的概念以及如何在 Solidity 智能合约中实现它。

输出

Solidity Data Types: Signed (int) and Unsigned Integers (uint)

程序 2:在下面的示例中,我们声明了一个名为 UnsignedIntegerExample2 的智能合约,以展示无符号整数 (unit) 的概念,并让我们看看如果我们为无符号数据类型传递一个负数会发生什么。

输出

Solidity Data Types: Signed (int) and Unsigned Integers (uint)

说明

结果是,如果您使用无符号数据类型传递负值,它将引发类型错误。

符号整数和无符号整数的区别

符号整数 (int) 和无符号整数之间的区别如下表所示:

序号符号整数无符号整数
1在 Solidity 中,符号整数可以存储正数和负数数据值。无符号整数数据类型只能存储非负值。
2符号整数使用 int 关键字声明。无符号整数使用 unit 关键字声明。
3当您想同时使用负值和正值时使用它。当您只想在智能合约中使用正值时使用它。
4符号整数的范围是从 -2 的 255 次方到 2 的 255 次方 - 1。‍无符号整数的范围是从 0 到 2 的 256 次方 - 1。

结论

深入理解 Solidity 数据类型、符号整数和无符号整数至关重要,因为它有助于开发者编写高效且易于阅读的智能合约。这使得您的代码更有效率,因为通过这些细节,编译器可以轻松地关联分配给特定变量(如整数或数组)的内存量和类型。它还有助于管理区块链 Gas,因为用户现在会根据您的变量的大小和类型谨慎地输入或选择单位。在本教程中,我们涵盖了所有细节和示例。请继续练习!