みなさん、
プログラミングをしていて
「正の整数だけのパラダイスみたいな変数を作りたい」
そう思ったことが一度はあると思います。
え?ないって?
じゃあ今思ってください
ということでこの記事ではそんなパラダイスを作れるデータ型 UInt型 について解説していきます。
UIntとは?
UIntとは Unsigned Integer(符号なし整数)の略で、0以上の整数だけを扱えるデータ型です。
let a: UInt = 10
一見Intと同じように見えますが
let b: UInt = -10
このようにマイナスの値を代入しようとすると、コンパイルエラーが表示されます。
つまりUIntはマイナスの値を許さないIntということです。
正の整数だけのパラダイス
上記から分かるようにUIntの世界には
- 負の方向
- 符号
が存在しません。
あるのは 0 と正の整数だけ。
コンパイル時にこの制約をチェックしてくれるため間違えてマイナスの値を入れていた時などには実行前に気づくことができます。
公式ドキュメント
Swiftのドキュメントを見てみるとUIntは
- 符号なしの整数型
- ビット幅は環境依存(多くは64bit)
- UInt8,UInt16,UInt32,UInt64などの型がある
と説明されています。
それぞれの世界の広さ
まずは、それぞれの最大値を見てみましょう。
print(Int.max)
print(UInt.max)
とするとこのようになります

UIntの方が2倍ほど大きい値になっていますね。
なぜUIntの方が大きいのか
これは内部的なビットの使い方の違いによるものです
Intは1ビットを+-の符号表現に使うのに対して、UIntはすべてのビットを数値の表現に使っています。
つまりUIntはIntの-領域をすべて正の整数に使えるためその分だけ表現できる最大値が大きくなるのです。
UIntの使い道
では実際、UIntはどんなところで使えるのでしょうか?
以下のような使い道があると考えています。
- 明らかに負の数にならない数を表すとき
- メモリを少しでも無駄に使わないようにしたい時
- RGB値のようなものを表現するとき
明らかに負の数にならない数を表すとき
例えば年齢や回数、配列のサイズなどを表すときにはこれらの値は マイナスになることがありえない値 であるのでUIntを使うことで「この値は絶対に負の数にならない」という意思を表現することができます。
メモリを少しでも無駄に使わないようにしたい時
UIntにはUInt8やUInt16など、
ビット幅が明確に決まっている型 が用意されています。
例えば UInt8 は、0〜255 の範囲の値だけを扱える型です。
重要なのは、
UInt8 は 1バイト(8bit)だけメモリを使う
という点です。
一方で Int は、環境にもよりますが
多くの環境では 8バイト(64bit) を使います。
例えば次のように大量のデータを扱う場合には、この差が効いてきます。
- 画像データ(RGB)
- バイナリデータ
- ネットワーク通信のパケット
こういった「この値は 0〜255 に収まる」など値の範囲が明確に決まっている場面なら、 UInt8 などの型を使うことで 無駄なメモリ消費を抑えることができます。
RGB値のようなものを表現するとき
色をRGB値で指定するときにもUInt8を使うと間違えて-100000000のような値が入ってエラーが発生するといったことが起こらないので安心です。
注意点
UIntは細かいところで便利ですが使う際にはいくつか注意点があります。
それは IntとUIntは別の型として扱われる ということです。
例えば
let i: Int = 10
let u: UInt = 5
let sum = i + u
このようなコードではコンパイルエラーが発生します。
暗黙的に型変換は行なってくれないんですね。
なのでこのように型変換をする必要があります。
let sum = i + Int(u)
またSwiftUIやUIKitではInt前提のAPIが多いのでその辺りも考慮が必要ですね。
まとめ
以上UIntについて解説してみました。
ここまで読んでくださった皆様、ありがとうございます。
UIntはRGB値のような値に対して意味や範囲を厳密に表したいときにちょこっと使うくらいで滅多に使われないものかなと思います。
もし、「あー、正の整数だけのパラダイスみたいな変数にしたいなー」と思う時があったら、UIntについて思い出してみてください。
また、もし「こんな使い方あるよ!」、「こう使うと便利だよ!」などがあるかたはぜひコメントから教えていただきたいです。