---
title: "Solidity 数据类型：有符号整数（int）与无符号整数（uint）"
description: "了解 Solidity 数据类型，以及 int、uint 等常见类型的使用方法。"
---

# Solidity 数据类型：有符号整数（int）与无符号整数（uint）

[Solidity](https://www.alchemy.com/overviews/solidity) 是一种高级、面向对象的静态类型语言，开发者用它在 Ethereum 区块链上部署应用程序。作为一种静态类型语言，[Solidity](https://www.alchemy.com/dapps/solidity) 要求开发者在编译时定义每个状态变量和局部变量的结构和数据类型。

因此，在[学习 Solidity 智能合约](https://www.alchemy.com/overviews/learn-solidity)时，理解 Solidity 数据类型至关重要。数据类型将存储在变量中的信息划分为不同的类别，如整数、布尔值、地址、字面量、数组等。

本文将阐述 Solidity 中的数据类型，并详细说明常见的整数类型，如 uint 和 int。

## **什么是 Solidity 数据类型？**

**与其他静态类型语言类似，Solidity 数据类型指定了存储在变量中的信息，例如一个具体的值，或者一个内存位置的引用地址。**

Solidity 中的数据类型具有灵活性，你可以组合基本类型来构成复杂类型，例如整数数组，或包含不同类型变量的结构体。

不过，Solidity 的一个关键限制是，开发者需要在编译时指定每个变量的数据类型。一旦声明，编译器就能准确知道需要为该变量预留多少空间。

Solidity 数据类型大致可分为两大类：值类型和引用类型。

### **什么是值类型？**

Solidity 值类型（如整数）是在指定内存空间内存储数据的变量，在函数或赋值中使用时会传递一份复制的值。这种值类型存储的是数据的一份独立副本，因此对复制值的任何更改都不会影响原始值类型。

Solidity 有八种值类型：有符号/无符号整数、布尔值、定点数、地址、字节数组、字面量、枚举，以及合约和函数类型。以下是简要说明：

1. **有符号/无符号整数** - 整数数据类型存储整数，有符号整数可以存储正值和负值，无符号整数只能存储非负值。
1. **布尔值** - 布尔数据类型用 bool 关键字声明，只能持有两种可能的常量值：true 或 false。
1. **定点数** - 定点数表示 Solidity 中的小数，不过目前尚未被 [Ethereum virtual machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm) 完全支持。
1. **地址** - address 类型用于存储 Ethereum 钱包或智能合约地址，通常约为 20 字节。地址类型可以加上关键字“payable”后缀，将其限制为只能存储钱包地址，并使用 transfer 和 send 等加密货币转账函数。
1. **字节数组** - 用关键字“bytes”声明的字节数组是一种固定大小的数组，用于存储最多 32 个预定义数量的字节，通常与关键字（bytes1、bytes2）一起声明。
1. **字面量** - 字面量是不可变的值，例如地址、有理数和整数、字符串、unicode 及十六进制数，可以存储在变量中。
1. 枚举 - 枚举（Enumerable 的简称）是一种用户自定义数据类型，将变量的值限制为程序中定义的一组特定常量。
1. 合约与函数类型 - 与其他面向对象语言类似，合约类型和函数类型分别用于表示类及其函数。合约包含可以修改合约状态变量的函数。

### **什么是引用类型？**

Solidity 引用类型（如[**固定数组和动态数组**](https://www.alchemy.com/overviews/solidity-arrays)）是指向所存储数据内存地址的变量。与值类型不同，引用类型本身不存储任何值，而是作为目标数据的位置追踪器。引用类型主要分为以下四类：

- **固定数组** - 固定数组是在初始化时声明、运行时大小预先确定的数组。
- **动态数组** - 动态数组用于在运行时根据程序需要存储的数据动态分配大小。
- **结构体** - [Solidity 中的结构体](https://www.alchemy.com/overviews/solidity-struct)是一种复杂数据类型，允许你创建包含其他类型成员的自定义类型，通常用于组合关联数据。
- **映射** - [映射](https://www.alchemy.com/overviews/solidity-mapping)以键值对的形式存储数据，类似于其他面向对象语言中的字典，其中键是一种值数据类型，值可以是任意类型。

## **什么是有符号整数（int）？**

**有符号整数是用 int 关键字声明的值数据类型，用于存储正整数或负整数值，范围从 -2 的 255 次方到 2 的 255 次方减 1。**

### **Solidity 整数大小**

关键字 int 是 int256 的缩写，是一种可存储最多 256 位整数或数据单元的整数数据值。这种值数据类型也可以按 8 的步长指定为更小的数据值，如 int8、int16、int32、int64、int128 和 int256。如果开发者希望限制变量的大小并优化性能，可以使用 int8、int16、int32 或 int64 等较小的数据类型。

## **什么是无符号整数（uint）？**

**无符号整数是用 uint 关键字声明的值数据类型，用于存储大于等于零的整数值，范围从 0 到 2 的 255 次方减 1。**

### **Uint 数据大小**

与有符号整数类似，关键字 uint 是 uint256 的缩写，是一种可存储最多 256 位整数或数据单元的无符号整数数据值。

无符号整数值数据类型也可以按 8 的步长指定为更小的数据值，最小为 uint8，最大为 uint256。具体的档位有 uint8、uint16、uint32、uint64、uint128 和 uint256。

## **有符号整数和无符号整数有什么区别？**

**有符号整数和无符号整数的关键区别在于，有符号整数既可以存储正值也可以存储负值，而无符号整数只能存储非负值。**因此，虽然有符号整数和无符号整数都属于值数据类型，但无符号整数在可存储的数值范围上是受限的。

在[智能合约](https://www.alchemy.com/overviews/solidity-smart-contract)中，这一区别提醒开发者需要重视数据类型中存储的数值，以避免出错。

## **uint 和 uint256 有什么区别？**

**uint 和 uint256 的定义完全相同，因为它们互为别名，但通过明确写出整数的数据大小，uint256 符合编写智能合约的最佳实践，能够提升代码的可读性和一致性。**

除此之外，uint 和 uint256 这两个关键字并无区别。选择使用哪一个取决于开发者，以便为代码提供更多细节信息。

## **在你的智能合约中开始使用有符号和无符号整数（uint）**

正确使用 Solidity 数据类型对于开发高效、可读的智能合约至关重要。这些数据类型帮助编译器理解需要为特定变量（如整数或数组）分配多少以及哪种类型的内存。在区块链上分配空间需要消耗 gas，因此在声明变量的大小和类型时应当谨慎。

如果你想继续学习 Solidity 及其相关特性，欢迎[预约席位](https://university.alchemy.com/?a=ffa69917a7)，参加 Alchemy University 为期 7 周的 Ethereum 开发者训练营。
