2016-11-05 1 views
-1

私はこの質問に答える必要のある仕事を学校で持っています:制限されたRAMデバイス(あらゆる言語)でINTオーバーフローを処理する方法は?

"2人の生徒が1月1日から0日までの日数多くの小さなコンピュータでは、Intの最大値は32767です。これを無視するとどうなりますか?この問題をどのように解決できますか?

質問の種類がわかりません。私は現在Pythonで作業していますが、PythonはIntをLongに変換してIntオーバーフローを自動的に処理します。他のプログラミング言語は同様の処理を行います(たとえば、負の数に折り返す、AKA 32768は-32767になります)。プログラミング言語が自動的にオーバーフローを処理しなかった場合、数値が32767を超えるとエラーが発生すると思います...そうですか?

"絶対日数"(32767以上で、Intのみを使用できると仮定して)を印刷したい場合は、値をIntに格納することができないため、できません。それは不可能だろう。今日の日付を印刷したいのであれば、PC BIOSから取り出すか、代わりにUnixの時間を使うだけです。

私にとっては、この質問に対する答えは、プログラムが何をしたいのかによって決まるようです。しかし、私の先生はいいえと言います。彼は私の答えのどれも正しいとは言わない。私は彼がどんな答えを望んでいるのか正確には分かりません。私は約2ヶ月しかプログラミングをやっていないので、これは簡単な質問です。私は何が欠けているのですか?私はこれを熟考していますか?

+0

'変数> 32768:raise OverflowError'? – MaxLunar

+0

* unsigned int *、 'uint32_t'、' uint64_t'、 'int32_t'、または' int64_t'のようなより大きな容量の変数を使用してください。アセンブリ言語では、加算または乗算後にキャリービットまたはオーバーフロービットをテストできます。 –

+0

もう一つの方法は、複合整数を作るのにそれ以上の 'int'を使うことです。 –

答えて

0

ご存じのように、整数のオーバーフローを処理する言語が存在するため、これは言語に不可欠ではありません。

これはRAMとは関係ありません。

これは現代のCPUアーキテクチャと整数値の仕組みと関係があります。要するに、CPUは「ワード」と呼ばれる特定の量のビットでのみ動作することができます。通常、整数を扱うCPUの部分のレジスタは1ワードを保持できます。あなたの例では、ワードサイズであることを16

で、我々は保存することができます(バイナリで)maximunの数は次のとおりです。私たちはこれに1を追加したとき

ので
1111 1111 1111 1111 

、何が起こりますか?

1111 1111 1111 1111 
+0000 0000 0000 0001 

ウェル1 + 1は10(バイナリ)ですので、最後の位置は0になりますが、1を上回る必要があります。これにより、結果はすべて0になり、1が引き継がれます。この1は、CPUの特別な場所に格納され、後続の算術演算によって上書きされない限り、分岐命令によって利用することができる。 (通常、このいわゆるキャリービットはプログラミング言語では使用できません。)

私たちがここで見ているのは、65535 + 1の結果が0であり、これは間違っているようです。 しかし、整数演算が2^nのモジュロで行われるという考えに慣れておく必要があります.nはビット単位のワードサイズです。正しい結果は65536で、65536のmod 2 116は0です。

あなたの先生があなたにこれらの基本について教えてくれたら幸いです。

これを無視するとどうなりますか?あなたは間違った結果を得ることができます。

どうすれば解決できますか? 1つの整数に収まらない数値を表すには、2つの整数を使用します。これを行う方法は多くあります。理解しやすいが、メモリ効率に関して理想的ではない可能性の1つは次のようなものです。2つの整数の日数を表します。最初の整数では、数千を数えます。 2番目の例では、最後の3桁(10進表記)を表しています。たとえば、5を表すには、最初の整数を432に、2番目の整数を105に設定します。

0

CPUはすべての条件で無効な結果を検出しないので、自分で確認する必要があります。そして、あなたはまだ数学がうまくいかず、あなたが望む計算をすることができないという問題があります。別の解決策は、データをより大きなデータ構造に格納し、構造体に対して独自の加算/減算/ ...演算を実装することです。

これはPythonが行うことです。そのため、不確定に大きな整数をネイティブに格納できるのです。 Pythonのdecimalモジュールを見てください。 C/C++用のライブラリがあり、他の言語も想定しています。ちょっと面倒ですが実行可能なAPIを独自に実装することもできます。

関連する問題