---
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 的資料型別大致可分為兩大類：值型別（value types）與參照型別（reference types）。

### **什麼是值型別？**

Solidity 的值型別，例如整數，是將資料儲存在一個定義好的記憶體空間中的變數，在函式或賦值中使用時會傳遞一份複製值。這種值型別會儲存被複製資料型別的獨立副本，因此對複製後的值型別所做的任何變更，都不會改變原始的值型別。

Solidity 有八種值型別：有號／無號整數、布林值、定點數、地址、位元組陣列、字面值、列舉，以及合約與函式型別。以下是快速參考：

1. **有號／無號整數（Signed/Unsigned integers）** - 整數資料型別儲存整數，有號整數可儲存正值與負值，無號整數則只能儲存非負值。
1. **布林值（Booleans）** - 布林資料型別以 bool 關鍵字宣告，僅能保存兩個可能的常數值：true 或 false。
1. **定點數（Fixed-point numbers）** - 定點數在 Solidity 中表示小數，不過目前[Ethereum virtual machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)尚未完全支援此型別。
1. **地址（Addresses）** - address 型別用於儲存 Ethereum 錢包或智能合約的地址，通常約為 20 位元組。address 型別可加上關鍵字「payable」作為後綴，這會限制它只能儲存錢包地址，並使用 transfer 與 send 加密貨幣函式。
1. **位元組陣列（Byte arrays）** - 位元組陣列以關鍵字「bytes」宣告，是固定大小的陣列，用於儲存最多 32 個預先定義數量的位元組，通常會與關鍵字（bytes1、bytes2）一同宣告。
1. **字面值（Literals）** - 字面值是不可變的值，例如地址、有理數與整數、字串、unicode 及十六進位值，這些都可以儲存在變數中。
1. 列舉（Enums） - Enums，全稱 Enumerable，是一種使用者自訂的資料型別，將變數的值限制在程式中定義的一組特定常數內。
1. 合約與函式型別（Contract & Function Types） - 與其他物件導向語言類似，合約型別與函式型別分別用來表示類別及其函式。合約包含可修改該合約狀態變數的函式。

### **什麼是參照型別？**

Solidity 的參照型別，例如[**固定陣列與動態陣列**](https://www.alchemy.com/overviews/solidity-arrays)，是指向所儲存資料之記憶體地址的變數。與值型別不同，參照型別本身不儲存任何值，而是作為指向目標資料的位置追蹤器。參照型別主要可分為以下四種：

- **固定陣列（Fixed arrays）** - 固定陣列是在初始化時宣告、於執行期間具有預先定義大小的陣列。
- **動態陣列（Dynamic arrays）** - 動態陣列用於在執行期間依據程式所需儲存的資料，動態配置大小。
- **結構（Structs）** - [Solidity 中的 Structs](https://www.alchemy.com/overviews/solidity-struct) 是一種複雜的資料型別，讓你可以建立包含其他型別成員的自訂型別，通常用於將相關資料分組。
- **映射（Mappings）** - [Mappings](https://www.alchemy.com/overviews/solidity-mapping) 以鍵值對的方式儲存資料，類似其他物件導向語言中的字典（dictionaries），其中鍵（key）為某種資料型別，值（value）則可以是任意型別。

## **什麼是有號整數（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 Developer Bootcamp。
