プログラミング言語にlongとかintって出てくるよな。longというからには何かが長いのでしょうが、何が長いかわかるか。コンピュータであつかう数の大きさにも関わるらしいのです。さらにプログラミング言語によっても考え方が違うらしいぞ。何の長さなのか、どう違うのかや名前の由来から言語別の違いまでプログラマでもあるライターのwoinaryと一緒に解説していきます。

ライター/woinary

某社で社内向け業務システムの開発、運用を30年近くやっていたシステム屋さん。現在はフリーランス。ガジェットやゲーム、ラノベが大好きなおっさんです。

longとintの違いは長さ、整数を表すint一族

image by iStockphoto

プログラミングで欠かせないのが変数です。よく何らかの値を入れる箱のようなものと説明します。この箱ですが、中に入れるものの大きさに限りがあります。そのため、どの大きさまで入るかということは重要です。そのサイズを表すときに使われるのが「長さ」。それが長いものが「long」になります。

でも、大きさならばlongよりはbigとかsmallの方が良さそうですよね。なぜ「長さ」で「long」なのかを、まずは他のプログラミング言語の考え方のもとになっているC言語を例として説明していきます。

int:標準の長さ

変数には何を入れるのかが決まっています。数値を入れる変数が数値型変数文字を入れる変数が文字型変数です。このうち数値型変数のサイズを表すのが「int」や「long」になります。

「int」は「integer」の略です。日本語にすると「整数」ですね。0と正負の小数点のつかない数値をさします。整数は無限ですが、コンピュータでは無限を扱うことができません。そのため必ず扱うことのできる数値の範囲が決まっています。いくつかある範囲の一つが「int」です。intは普通に使うにはこれくらいあればよいだろうという標準的なサイズになります。

long:longはintよりも長い

単に「long」と呼んでいますが、正確には「long」は「long int」の略です。つまりintより長い整数が「long (int)」となります。intで多くの場合は十分なのですが、それよりも大きな数値を扱いたい時もありますよね。その場合に必要なのがlongです。

これが原因で話題になっているのが「2038年問題」。これで十分だろうという考えでintを使っているコンピュータでは問題が起きてしまうというものになります。2000年前後には2000年問題が話題になりましたが、それよりも深刻ではないかとの意見もあるほどです。

中に入る数の範囲がいくつかに分かれているのは面倒かと思うかもしれません。なぜそのようになっているのか、変数の仕組みとともに後で説明します。

longがあればshortも?C言語の整数型

image by iStockphoto

C言語の数値型変数にlong(long int)とintがあると説明しましたが、実はshort(short int)もあります。longとは別に標準のintより短いものがshortです。では、長さとは何かについて見ていきます。

\次のページで「そもそも何の長さ?整数型変数のビット数」を解説!/

そもそも何の長さ?整数型変数のビット数

コンピュータの世界でよく聞く言葉が「ビット」です。例えば64ビットコンピュータとか使います。このビットとはなんでしょうか。実はビットは情報の単位です。コンピュータは0か1かで動くとよく言いますが、この0か1かという2通りが1ビットになります。

例えば4ビットあれば16通り8ビットあれば256通りnビットあれば2のn乗通りです。これで数を表せば、4ビットなら0〜158ビットなら0〜255nビットなら0〜2のn乗-1までになります。つまり「扱う数の範囲」というものがビットの数で変わるわけです。ビットは0か1なので4ビットなら1111、8ビットなら11111111のように数字が大きくなるほど長くなります。だから長い・短いと表現するわけです。

signed?unsigned?いろいろな種類のあるint一族

整数には正の数と負の数があります。一方、正の数しか使わないときも多いです。例えば、ものを数えるときは負の数は使いませんよね。コンピュータでは数をビットの数で表現します。

4ビットで16通りの数を表す場合を考えて見ましょう。このとき符号がない0〜15とみなすか、符号がある-8〜7とみなすかという2つの考え方があります。これがsignedとunsignedです。

符号のあるintをsigned int、ないintをunsigned intと呼びます。日本語では符号付き整数と符号なし整数です。符号付きだけあればよさそうに思えますが、符号が要らない場合も多いですよね。そうすると負の数を表す半分を使わないのはもったいないという考え方から符号付きと符号なしという考え方をC言語では取り入れています。省略した場合はsignedとみなされる決まりです。

実は同じ長さのことも?C言語の不思議

整数型の変数の長さが違う、それがintとlongと説明してきましたが、具体的な長さはどうなっているのでしょう。実はC言語のルールでは、厳密にどれがどの長さというのは決まっていません決まっているのは「short ≦ int ≦ long」という関係だけです。=が入っている不等号なので、実は全部同じという可能性もあります。コンピュータ毎に事情もあるので特に決めていなかったのです。

ただし、現代のコンピュータではおおむね決まっています。代表的なものを以下に挙げておきますので、参考にしてください。

・符号付き(signed)
 ・short int 16ビット(-32,768〜21,767)
 ・int 32ビット(-2,147,483,648〜2,147,483,647)
 ・long int 64ビット(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
・符号なし(unsigned)
 ・unsigned short int 16ビット(0〜65,535)
 ・unsigned int 32ビット(0〜4,294,967,295)
 ・unsigned long int 64ビット(0〜18,446,744,073,709,551,615)

C言語以外の言語では?言語によって異なる名前

image by iStockphoto

C言語の例を見てきましたが、他の言語ではどうでしょう。C言語は色々な言語のもとになっているので同じ考え方をしているものもあれば、違うものもあります。いくつかのプログラミング言語を例にして確認していきます。

\次のページで「C++:C言語と同じ考え方」を解説!/

C++:C言語と同じ考え方

C++言語はC言語をもとにオブジェクト指向などを取り入れたプログラミング言語です。今でも進化しています。C++言語の整数の数値型変数の考え方はC言語と同じです。同じようにlongやshort、signedやunsignedがあります。また、長さも同様です。

Java・C#:長さはすべて決まっている

C言語やC++言語をもとに生まれたのがJavaやC#です。こちらも考え方は同様ですが、大きな違いがあります。それは、longやintのサイズが明確に決まっていることです。C言語ではそれぞれの環境に合わせるために決まっていません。JavaやC#では一つのプログラムがどこでも動くことを目指しているので、サイズも厳密に決まっているのです。また、C/C++言語ではshort intやlong intをshortやlongと省略可能ですが、Java/C#では元々がshort,longになります。

具体的な例を以下にあげておきますので、参考にしてください。

・Java(符号なしはない)
 ・byte 8ビット符号付き(-128〜127)
 ・short 16ビット符号付き(-32,768〜32,767)
 ・int 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・long 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
・C#
 ・sbyte 8ビット符号付き(-128〜127)
 ・byte 8ビット符号なし(0〜255)
 ・short 16ビット符号付き(-32,768〜32,767)
 ・ushort 16ビット符号なし(0〜65,535)
 ・int 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・uint 32ビット符号なし(0〜4,294,967,295)
 ・long 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
 ・ulong 64ビット符号なし(0〜18,446,744,073,709,551,615)

Go・Swift:直球勝負、longではなくint64

Googleが発表したGo言語や、Appleが発表したSwift言語ではlongやshortという呼び方をやめて、int+ビットの長さで表しています。例えば、Go言語の32ビットの符号付き整数型はint32で、64ビットの符号なし整数型はuint64です。どちらもint,uintとビット数を指定しない書き方もあります。この場合はコンピュータによってビット数が32ビットか64ビットか変わるのです。

GoとSwiftについても例を挙げますので、参考にしてください。

・Go言語
 ・int コンピュータで異なる(32ビットか64ビット符号付き)
 ・uint コンピュータで異なる(32ビットか64ビット符号なし)
 ・int8 8ビット符号付き(-128〜127)
 ・uint8 8ビット符号なし(0〜255) ※byteでもよい
 ・int16 16ビット符号付き(-32,768〜32,767)
 ・uint16 16ビット符号なし(0〜65,535)
 ・int32 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・uint32 32ビット符号なし(0〜4,294,967,295)
 ・int64 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
 ・uint64 64ビット符号なし(0〜18,446,744,073,709,551,615)
・Swift言語
 ・Int コンピュータで異なる(32ビットか64ビット符号付き)
 ・UInt コンピュータで異なる(32ビットか64ビット符号なし)
 ・Int8 8ビット符号付き(-128〜127)
 ・UInt8 8ビット符号なし(0〜255)
 ・Int16 16ビット符号付き(-32,768〜32,767)
 ・UInt16 16ビット符号なし(0〜65,535)
 ・Int32 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・UInt32 32ビット符号なし(0〜4,294,967,295)
 ・Int64 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
 ・UInt64 64ビット符号なし(0〜18,446,744,073,709,551,615)

\次のページで「Python:数値はひとつ、サイズの違いなし」を解説!/

Python:数値はひとつ、サイズの違いなし

利用者が増えているPython言語ですが、実は整数の数値型変数はintしかありません符号なしという考え方もなく、すべての数は符号がつきます。また、最大値というものもなく、コンピュータのメモリの限り大きな数を扱うことができるのです。

ただ、それでは不便なこともあるので、便宜的な仮の最大値としてsys.maxsizeという変数が用意されています。これはコンピュータによって異なり、32ビット(2,147,483,647)か64ビット(9,223,372,036,854,775,807)のどちらかです。

longとintは扱う数値の範囲が違う、違う呼び方や区別がない言語も

コンピュータでは変数に数値を入れる際のビットの長さで扱うことのできる数の範囲が決まります。C言語では標準の整数型をintとして、それよりビットの長さが短いものをshort int、長いものをlong intとしました。まさにlongはintより長いわけです。

ただ、より後に生まれたプログラミング言語では考え方も違います。長い短いではなくビットの長さをそのままつけてint32の様な名前を付けているのがGo言語やSwift言語。またPythonではそもそもintしかありません。このようにプログラミング言語でも考え方が違うので、新しいプログラミング言語を学ぶ場合には、その言語でどう扱うかを確認してください。

" /> longとintの違いとは?あつかう範囲や名前の由来もプログラマーがわかりやすく解説 – ページ 3 – Study-Z
IT・プログラミング雑学

longとintの違いとは?あつかう範囲や名前の由来もプログラマーがわかりやすく解説

C++:C言語と同じ考え方

C++言語はC言語をもとにオブジェクト指向などを取り入れたプログラミング言語です。今でも進化しています。C++言語の整数の数値型変数の考え方はC言語と同じです。同じようにlongやshort、signedやunsignedがあります。また、長さも同様です。

Java・C#:長さはすべて決まっている

C言語やC++言語をもとに生まれたのがJavaやC#です。こちらも考え方は同様ですが、大きな違いがあります。それは、longやintのサイズが明確に決まっていることです。C言語ではそれぞれの環境に合わせるために決まっていません。JavaやC#では一つのプログラムがどこでも動くことを目指しているので、サイズも厳密に決まっているのです。また、C/C++言語ではshort intやlong intをshortやlongと省略可能ですが、Java/C#では元々がshort,longになります。

具体的な例を以下にあげておきますので、参考にしてください。

・Java(符号なしはない)
 ・byte 8ビット符号付き(-128〜127)
 ・short 16ビット符号付き(-32,768〜32,767)
 ・int 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・long 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
・C#
 ・sbyte 8ビット符号付き(-128〜127)
 ・byte 8ビット符号なし(0〜255)
 ・short 16ビット符号付き(-32,768〜32,767)
 ・ushort 16ビット符号なし(0〜65,535)
 ・int 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・uint 32ビット符号なし(0〜4,294,967,295)
 ・long 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
 ・ulong 64ビット符号なし(0〜18,446,744,073,709,551,615)

Go・Swift:直球勝負、longではなくint64

Googleが発表したGo言語や、Appleが発表したSwift言語ではlongやshortという呼び方をやめて、int+ビットの長さで表しています。例えば、Go言語の32ビットの符号付き整数型はint32で、64ビットの符号なし整数型はuint64です。どちらもint,uintとビット数を指定しない書き方もあります。この場合はコンピュータによってビット数が32ビットか64ビットか変わるのです。

GoとSwiftについても例を挙げますので、参考にしてください。

・Go言語
 ・int コンピュータで異なる(32ビットか64ビット符号付き)
 ・uint コンピュータで異なる(32ビットか64ビット符号なし)
 ・int8 8ビット符号付き(-128〜127)
 ・uint8 8ビット符号なし(0〜255) ※byteでもよい
 ・int16 16ビット符号付き(-32,768〜32,767)
 ・uint16 16ビット符号なし(0〜65,535)
 ・int32 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・uint32 32ビット符号なし(0〜4,294,967,295)
 ・int64 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
 ・uint64 64ビット符号なし(0〜18,446,744,073,709,551,615)
・Swift言語
 ・Int コンピュータで異なる(32ビットか64ビット符号付き)
 ・UInt コンピュータで異なる(32ビットか64ビット符号なし)
 ・Int8 8ビット符号付き(-128〜127)
 ・UInt8 8ビット符号なし(0〜255)
 ・Int16 16ビット符号付き(-32,768〜32,767)
 ・UInt16 16ビット符号なし(0〜65,535)
 ・Int32 32ビット符号付き(-2,147,483,648〜2,147,483,647)
 ・UInt32 32ビット符号なし(0〜4,294,967,295)
 ・Int64 64ビット符号付き(9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
 ・UInt64 64ビット符号なし(0〜18,446,744,073,709,551,615)

\次のページで「Python:数値はひとつ、サイズの違いなし」を解説!/

次のページを読む
1 2 3 4
Share: