データの保存方法の問題です。サムとのやり取りは、書き出すことができるが、8文字分の紙しか持っていないように求めていれば、より良い比較になるでしょう。
「サム、電話番号を教えて」
「5555555555」
「いや、私は紙切れです。事前にどれだけのデータを要求していたかを事前に知っていれば、もっとよく準備できたはずです!」
その代わり、ほとんどの言語では型を宣言するため、事前に知って準備します。
「サム、電話番号の長さは?」
「10文字。」
「さて、それからもっと大きな紙をもらおう。今すぐphoneNumberをくれ。」
「5555555555」
「ありがとう!サムありがとう!」
データが保存される実際の基本的な方法を見ると、さらに難しくなります。あなたが私のような人なら、雑多なメモ、数字が走り書きされただけで、何の文脈もラベル付けもされていないノートブックがあり、3日後にその意味がわからない。これはコンピューターにとっても何度も問題です。多くの言語には、「int」型(int、long、short、byte)および「float」(float、double)型があります。なぜそれが必要なのですか?
まず、整数がどのように格納され、一般的にコンピューター内で表現されるかを見てみましょう。基本レベルでは、すべてバイナリ(1と0)であることをご存知でしょう。バイナリは実際には、10進数システムとまったく同じように機能する番号システムです。10進数で、0から9(書き込みのない無限の暗黙の先行ゼロを含む)をカウントし、0にロールオーバーして次の桁をインクリメントして10にします。19から20にロールオーバーするまで繰り返します。 99から100にロールオーバーするまで繰り返します。
バイナリも同じです。ただし、0〜9の代わりに0〜1をカウントします。0、1、10、11、100、101、110、111、1000。 1001として。これは実際の数値です。正確にその形式で加算、減算、乗算などを行うことができます。10 + 1 =11。10+ 10 = 100(1から0にロールオーバーして1を運びます)。11 x 10 = 110(および同等に、11 + 11 = 110)。
現在、実際のメモリ(レジスタを含む)には、ビット(潜在的な1'sまたは0 ')のリスト、配列、呼び出したいものがあり、これらのビットを論理的に整理して、問題は、小数で何をしますか?レジスタの2つのビットの間にハードウェアを挿入することはできません。各ビットペアの間に「10進ビット」を追加するとコストがかかりすぎます。じゃあ何をすればいいの?
エンコードします。一般に、CPUまたはソフトウェアのアーキテクチャがこれを行う方法を決定しますが、1つの一般的な方法は、レジスタの最初のビットに仮数(シフトした数字)で符号(+または-、通常1は負)を格納することですただし、次のXのビット数の場合は小数を取り除く必要が何度もあり、残りの場合は指数(シフトする必要がある回数)が必要です。科学表記法に似ています。
入力することで、コンパイラーは何を見ているかを知ることができます。レジスタ1に値1.3を保存したと想像してください。ここでは、符号用に1ビット、仮数用に4ビット、指数用に3ビット(符号用1ビット、大きさ2)の独自の空想エンコーディングスキームを考えます。これは正の数であるため、符号は正(0)です。仮数は13(1101)、指数は-1(101(負の場合は1、01 = 1))になります。したがって、レジスタ1に01101101を格納します。この変数を入力しなかったので、ランタイムがそれを使用するとき、「確かに、これは整数です」と言うので、値を出力するときに109(64 + 32 + 8 + 4 + 1)、これは明らかに正しくありません。
ただし、すべての言語で明示的に入力する必要があるわけではありません。C#には、変数の型をコンパイル時に解釈させるキーワード "var"があり、Javascriptなどの他の言語は完全に動的に型付けされ、変数に整数を格納し、ブール値に割り当てることができます。再度文字列に割り当てると、言語はすべてを追跡します。
しかし、コンパイラー、インタープリター、またはランタイムの方がはるかに簡単です-そして、すべてのタイピングを通してソートする貴重なリソースを費やす必要がないため、多くの場合、プログラムが高速になります-プログラマー、どのようなあなたがそれを与えているデータ。