整数の最大値:Java対C対Python
1. 序章
データサイエンスでは、整数について話すとき、数学的な整数の範囲を表すデータ型を指します。 数学的な整数には上限がないことはわかっていますが、これはメモリサイズの点で問題になる可能性があり、ほとんどすべてのコンピュータアーキテクチャでこのデータ型を制限する必要があります。
それが、今日私たちが尋ねようとしている質問です。「特定のマシンで表現できる最大の整数値はいくつですか?」
2. 問題の説明
そうですね、
- プラットフォームビット
- 使用言語
- 署名付きまたは署名なしのバージョン
コンピュータサイエンスでは、整数の最も一般的な表現は、2進数システムとして格納された2進数(ビット)のグループによるものです。 メモリバイトの順序はさまざまです。ビットを使用すると、整数をエンコードできます。
この単純な例で違いを確認できます。ビットを使用すると、toまたはfromtoの整数をエンコードできます。
通常、整数サイズ はマシンアーキテクチャによって定義されますが、一部のコンピューター言語も整数サイズを個別に定義します。異なるCPUは、独自のプラットフォームに基づいて異なるデータ型をサポートします。 通常、すべてが符号付きタイプと符号なしタイプの両方をサポートしますが、幅の制限された固定セット(通常は8、16、32、および64ビット)のみをサポートします。
一部の言語では、2種類以上の整数データ型が定義されています。1つはメモリを保持してストレージを節約するために小さく、もう1つはサポートされる範囲を改善するために大きくなります。
覚えておくべきもう1つのことは、プラットフォームのワードサイズ(ワード長とも呼ばれます)です。
コンピュータサイエンスでは、単語は特定のプロセッサ設計で使用されるデータの単位であり、プロセッサのハードウェアによって1つの単位として処理される固定サイズのデータです。 ワードサイズについて話すときは、numを参照します一言で言えば、これは特定のコンピュータアーキテクチャとプロセッサ設計の重要な特徴です。
現在のアーキテクチャは通常64ビットのワードサイズですが、32ビットのアーキテクチャもあります。
3. 答えの時間
このセクションでは、旧友のCから比較的新しいPythonまで、常緑のJavaを経由して質問に答えます。 はじめましょう。
3.1. C
C言語は、さまざまなマシンタイプで同じように機能することを目的として、1972年に設計されました。 したがって、整数データ型の範囲はマシンアーキテクチャに依存するため、直接決定されません。
ただし、Cには2種類の整数があります。 shortおよびlong。
短整数は、少なくとも16ビットです。 したがって、16ビットマシンでは、長整数形式と一致します。 短整数形式の範囲は、符号付きバージョンの場合は-32,767〜32,767、符号なしバージョンの場合は0〜65,535です。 まあ、それは奇妙ですが、署名されたバージョンでは、私たちは数を逃しているようです。 説明するのは簡単です:サインのために1ビットが必要だからです!
64ビットシステムで実行する場合、 long 形式は、符号なしデータ型の18,446,744,073,709,551,615に対応し、符号付きバージョンでは-9,223,372,036,854,775,807から9,223,372,036,854,775,807の範囲の値に達する可能性があることを簡単に計算できます。
完全を期すために、longlong整数データ型について少し説明します。 long long形式は、Cでは使用できませんが、C99バージョンでのみ使用できます。 long データ型の2倍のメモリ容量がありますが、以前のC標準を必要とするコンパイラでは明らかにサポートされていません。 long longデータ型を使用すると、巨大なに到達できます。 32ビットマシン以降で実行している場合。
3.2. Java
Javaについて言えば、Javaは仮想マシンを介して機能することを覚えておく必要があります。 これにより、C言語で説明されているすべての変動から私たちを救うことができます。
- バイト(8ビット)
- short (16ビット)
- int (32ビット)
- long (64ビット)
したがって、長整数形式では、64ビットマシンのCと同じように に到達できますが、今回はすべてのマシンアーキテクチャに到達できます。
ただし、 char 形式のおかげで、ビット操作を行うことで、符号なしバージョンを取得できます。 これは16ビット形式であるため、符号なし整数形式は65,535に達する可能性があります。
しかし、Javaを使用すると、少しハックしてさらに進んで、BigIntegerクラスライブラリを介して非常に大きな整数を表すことができます。 このライブラリは、小さな変数の配列を組み合わせて、膨大な数を構築します。 唯一の制限は物理メモリであるため、整数の巨大な範囲を表すことができます。
たとえば、1キロバイトのメモリを使用すると、最大2,466桁の整数に到達できます。
3.3. Python
Pythonは、トップレベルの構成として、任意精度の整数(無限精度の整数またはbignumとも呼ばれる)を直接サポートします。
つまり、Java BigInteger と同様に、任意の大きな整数に必要なだけのメモリを使用します。 したがって、プログラミング言語に関しては、この質問はPythonにはまったく当てはまりません。なぜなら、単純な整数型は理論的には無制限だからです。
無制限ではないのは、現在のインタープリターのワードサイズであり、ほとんどの場合、マシンのワードサイズと同じです。その情報はPythonで sys.maxsize として利用可能であり、署名された単語で表現できる最大値に対応する、可能な最大のリストまたはメモリ内シーケンスのサイズ。
64ビットマシンでは、=9,223,372,036,854,775,807に対応します。
4. フローチャート
これまでに見たものを要約するフローチャートを見てみましょう。
5. 各言語の実際のコード
これまでに説明した内容を直接確認するための実際のコードを次に示します。 このコードは、各言語の整数の最大値と最小値を示しています。
これらの値はPythonには存在しないため、コードは現在のインタープリターの単語サイズを表示する方法を示しています。
5.1. Cコード
#include<bits/stdc++.h>
int main() {
printf("%d\n", INT_MAX);
printf("%d", INT_MIN);
return 0;
}
5.2. Javaコード
public class Test {
public static void main(String[] args) {
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
}
}
5.3. Pythonコード
import platform
platform.architecture()
import sys
sys.maxsize
6. 結論
ただし、メモリ消費とシステムラグを防ぐために、常に自分の状況に最適なものを使用する必要があります。