---
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)では、開発者はコンパイル時にすべてのstate変数とlocal変数の構造とデータ型を定義する必要があります。

そのため、[Solidityスマートコントラクトを学ぶ](https://www.alchemy.com/overviews/learn-solidity)上でSolidityのデータ型を理解することは不可欠です。データ型は、integer、boolean、address、literal、arrayなど、変数に格納される情報を種類ごとに分類します。

本記事では、Solidityにおけるデータ型とは何かを定義し、uintやintといった一般的なinteger型について詳しく説明します。

## **Solidityのデータ型とは**

**他の静的型付け言語と同様に、Solidityのデータ型は、特定の値やメモリ上の場所を指す参照アドレスなど、変数に格納される情報を指定します。**

Solidityのデータ型は柔軟であり、integer arrayや異なる型の変数を持つstructureのような複雑な型を作るために、elementary typeを組み合わせることができます。

しかし、Solidityの重要な制約の1つは、開発者がコンパイル時にすべての変数のデータ型を指定する必要がある点です。宣言されると、コンパイラはその変数のためにどれだけのスペースを確保する必要があるかを正確に把握します。

Solidityのデータ型は、大きく2つのグループ、value typeとreference typeに分類できます。

### **value typeとは**

Solidityのvalue type(integerなど)は、定義されたメモリ領域内にデータを格納する変数であり、関数や代入の中で使用される際には複製された値を渡します。このvalue typeは複製されたデータ型の別のコピーを保持するため、コピーされたvalue typeの値を変更しても、元のvalue typeは変化しません。

Solidityには、符号付き/符号なしinteger、boolean、fixed point number、address、byte array、literal、enum、そしてcontract・function typeという8種類のvalue typeがあります。それぞれが何を表すかの早見表は以下の通りです。

1. **符号付き/符号なしinteger** - integerデータ型は整数を格納します。符号付きintegerは正負両方の値を格納でき、符号なしintegerは非負の値のみを格納します。
1. **boolean** - boolean型はboolキーワードで宣言され、trueまたはfalseの2つの定数値のみを保持できます。
1. **fixed point number** - fixed point numberはSolidityにおける小数を表しますが、[Ethereum virtual machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)ではまだ完全にはサポートされていません。
1. **address** - address型は、Ethereumウォレットまたはスマートコントラクトのaddressを格納するために使用され、通常約20バイトです。address型には「payable」というキーワードを付加でき、これによりウォレットaddressのみを格納し、transferおよびsend関数を使用できるよう制限されます。
1. **byte array** - byte arrayは「bytes」というキーワードで宣言される固定サイズのarrayで、最大32バイトまでの定められた数のバイトを格納するために使用されます。通常はbytes1、bytes2のようにキーワードとともに宣言されます。
1. **literal** - literalは、address、有理数やinteger、string、unicode、hexadecimalなど、変数に格納できる不変の値です。
1. enum - Enumerableの略であるenumは、プログラム内で定義された特定の定数の集合に変数の値を制限する、ユーザー定義のデータ型です。
1. contract・function type - 他のオブジェクト指向言語と同様に、contract型とfunction型はそれぞれクラスとその関数を表すために使用されます。contractには、contractのstate変数を変更できる関数が含まれます。

### **reference typeとは**

Solidityのreference type(例えば[**fixed arrayおよびdynamic array**](https://www.alchemy.com/overviews/solidity-arrays))は、格納されたデータのメモリアドレスを指す変数です。value typeとは異なり、reference typeはいかなる値も格納せず、対象データの場所を追跡する役割を果たします。reference typeは主に以下の4種類に分類されます。

- **fixed array** - fixed arrayは、初期化時に定義される、実行時のサイズがあらかじめ決められているarrayです。
- **dynamic array** - dynamic arrayは、プログラムが格納する必要のあるデータに応じて、実行時に動的にサイズを割り当てるために使用されます。
- **struct** - [Solidityのstruct](https://www.alchemy.com/overviews/solidity-struct)は、他の型のmemberを含むカスタム型を作成できる複雑なデータ型で、通常は関連するデータをグループ化するために使用されます。
- **mapping** - [mapping](https://www.alchemy.com/overviews/solidity-mapping)は、他のオブジェクト指向言語のdictionaryと同様に、key-valueペアでデータを格納します。keyは値のデータ型であり、valueは任意の型です。

## **符号付きinteger(int)とは**

**符号付きintegerは、intキーワードで宣言されるvalue typeで、-2の255乗から2の255乗-1までの範囲の正または負のinteger値を格納します。**

### **Solidityのintegerサイズ**

intキーワードはint256の省略形であり、最大256ビットのintegerまたはデータ単位を格納できるintegerデータ値です。このvalue typeは、int8、int16、int32、int64、int128、int256のように、8刻みでより小さいデータ値として指定することもできます。開発者は、変数のサイズを制限しパフォーマンスを最適化したい場合、int8、int16、int32、int64などのより小さいデータサイズを使用できます。

## **符号なしinteger(uint)とは**

**符号なしintegerは、uintキーワードで宣言されるvalue typeで、0から2の255乗-1までの範囲の、0以上のinteger値を格納します。**

### **uintのデータサイズ**

符号付きintegerと同様に、uintキーワードはuint256の省略形であり、最大256ビットのintegerまたはデータ単位を格納できる符号なしintegerデータ値です。

符号なしintegerのvalue typeも、uint8からuint256までの範囲で、8刻みでより小さいデータ値として指定することができます。その区分はuint8、uint16、uint32、uint64、uint128、uint256です。

## **符号付きintegerと符号なしintegerの違いは何か**

**符号付きintegerと符号なしintegerの主な違いは、符号付きintegerは正負両方の値を格納できるのに対し、符号なしintegerは非負の値のみを格納できる点です。** したがって、符号付きintegerと符号なしintegerはどちらもvalue typeですが、符号なしintegerは格納できる値の範囲が制限されています。

[スマートコントラクト](https://www.alchemy.com/overviews/solidity-smart-contract)においては、この違いにより、開発者はエラーを避けるためにデータ型に格納する値を優先的に考慮する必要があります。

## **uintとuint256の違いは何か**

**uintとuint256はエイリアスであるため同じ定義を共有していますが、integerのデータサイズを明示的に記述することで、uint256はスマートコントラクト作成のベストプラクティスに沿い、コードの可読性と一貫性を向上させます。**

それ以外に、uintとuint256のキーワードに違いはありません。どちらを使用するかの区別は、コードにより詳細な情報を持たせたいと考える開発者次第です。

## **スマートコントラクトで符号付き・符号なしinteger(uint)を使い始める**

適切なSolidityのデータ型を使用することは、効率的で読みやすいスマートコントラクトを開発する上で極めて重要です。これらのデータ型は、integerやarrayなど特定の変数に対して、コンパイラがどれだけの量とどの種類のメモリを割り当てる必要があるかを理解する助けとなります。ブロックチェーン上でスペースを割り当てるにはgasを消費するため、変数のサイズと型を宣言する際には注意が必要です。

Solidityとその機能について学び続けたい場合は、Alchemy Universityの7週間のEthereum Developer Bootcampに[申し込んで](https://university.alchemy.com/?a=ffa69917a7)ください。
