現在作っているプログラムで、一定時間ごとに変数に一定値が
加算され続けるような場所があります。
基本的にはint型の最大値を超えることはまずないのですが、
C言語やC++でたとえばint型で宣言した変数に対し、x++;
のように一定周期ごとに記述して加算してゆき、最大値である、
+2147483647を超えた場合、xには何が代入されているんでしょうか。
-2147483648~+2147483647が範囲ですから、一周して、
最低値である-2147483648に加算されてゆくことになるのでしょうか?
それとも、超えることが予想される場合、最大値を超えたら0にするなど
明示的に何らかの対処をしたほうがよいのでしょうか。
プログラム的には中身の数値に関してはあまり関係ないので、
その変数型の範囲で不可なく動作するなら問題ありません。
超えることが予想される場合、対処するべきなのか、
放っておいてもよいのかどうかを教えていただきたいです。
No.5ベストアンサー
- 回答日時:
実験して調べて見るのが近道でしょう。
C言語を調べると「負数は2の補数で表すとは限らない」となっているので、予想通りにはならないかも知れません。
でも、あなたの予想通りになるんじゃないかな。
ソフトでも何でも、まずは基本が動く事。次にエラー対処の仕様をどのようにするかがポイントです。
この場合は最大値で保持するのが良いでしょう。更にその後ディクリメントが有っても最大値を保持したままにするとか。
そのような仕様を抜け目無く考えるのが大変なんですよ。
No.4
- 回答日時:
> あっているでしょうか?
あっているかどうかは、処理系を特定しなければ何ともいえません。
もっと具体的にいうと...
1バイト=8ビットの処理系で、1バイトの整数値について考えた場合、-127の内部表現は次の3種類があります。
10000000 (1の補数表現)
10000001 (2の補数表現)
11111111 (符号ビットと絶対値)
さらに、オーバーフローが発生すると例外(C++の例外ではなくハードウェア的なもの)が発生する処理系もあります。
これらを考えると、どうなるかは一概にはいえないことが分かるはずです。
No.3
- 回答日時:
こんにちは。
プログラムの動作としては、既に回答が出ている通りです。
「数値の動作」に的を絞ってご質問に答えるとするならば、
>一周して、最低値である-2147483648に加算されてゆくことになるのでしょうか?
これはYesです。
ただ、「一周」という表現が少し引っかかるのですが、補数表現に対するご認識は大丈夫でしょうか。
>超えることが予想される場合、対処するべきなのか、
絶対に対処するべきです。
ただ、最大値を超えたら0にする、よりは、最大値を超えそうになったら最大値をキープするようにした方が何となく自然かなという気がします。(もちろん、開発しているソフトの仕様によりますが)
みなさん解答ありがとうございました。
一応対処事態はしていたのですが、その処理しなかった場合、
どのような動作を起こすのかただ気になりましたので
質問させていただきました。
>一周して、補数表現
たとえば1バイトで一番左を符号として考えるなら、
10進数で+127は01111111、-127は10000000などということですよね?
なんとなくイメージ的に周回してると捉えていただけです(^^;)
最大値を超えるというのは、01111111+1などを考えると、
10000000となるので、最低値の-127になると考えていたのですが、
あっているでしょうか?
No.1
- 回答日時:
オーバーフローは割り込み対象です。
ただマスク出来るので無視したら、+1を続けると
最大値からマイナスの最小値になると思います。
マスクしなければ、ゼロ割のようにプログラムは
落ちます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(自然科学) 風車音の測定 3 2023/04/28 07:12
- 中学校受験 中学受験 3 2022/11/13 21:17
- 数学 数学の証明問題について質問です。 今日私大入試があったのですが、AとBの共通部分となるxの範囲を求め 1 2023/02/10 15:27
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- 統計学 統計検定2級の過去問について 1 2023/01/04 16:40
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- 数学 株価予想の一致率(?)の求め方について 5 2022/12/27 04:44
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
きれいなVBプログラミング
-
API、OCX、DLLって何でしょう?
-
コンソールアプリでファイル選...
-
UNIX環境でのCプログラム上でC...
-
ランチャーの作り方について教...
-
VBプログラムをEXCEL VBAに移植...
-
OSとCPUの関係について
-
Ryzen 3700(無印)はWin11に対応...
-
.Net とは何ですか?
-
PICのI2C通信のプログラムについて
-
1年無職の彼氏 別れるべきですか?
-
キャリアが袋小路に
-
HTML 特殊文字の タブ:	...
-
衛星管理者受験について
-
文字が消える?
-
機械工学専攻の院卒でSEになる...
-
6~7割の正解で、なぜ合格?
-
仕事でExcelほとんど使わないん...
-
IE6でaタグのvisitedより、aタ...
-
ホームページで画像を動かしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
API、OCX、DLLって何でしょう?
-
VBプログラムをEXCEL VBAに移植...
-
C言語のHP-UXからLinuxへのポ...
-
OSとCPUの関係について
-
コンソールアプリでファイル選...
-
SNMPトラップ情報をC#.netで作...
-
WEBページに読み書きするプログ...
-
変数の大きさを超える代入
-
Perl5とActivePerl
-
UNIX環境でのCプログラム上でC...
-
.Net とは何ですか?
-
3ウェイハンドシェイクの流れ...
-
i,j,k
-
DLLってなに?
-
VBS:コンピュータ名を取得し、...
-
Ryzen 3700(無印)はWin11に対応...
-
CGIとは?
-
プログラミング 素数か素数では...
-
プログラマやシステムエンジニ...
-
このプログラミング誰か教えて...
おすすめ情報