アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミング
2つの整数を読み込んで、等しければ 「二つの値は同じです」と表示し、そうでなければ,、小さいほうの値と大きい方の値の両方を表示するプログ ラムを作りたいんですけど、この写真のようにやったら、大きい実行結果で大きい値が異なってしまったのですがなぜなのでしょうか。

「プログラミング 2つの整数を読み込んで、」の質問画像

質問者からの補足コメント

  • 値をこんなに大きくしなければうまくいくんですけど、

      補足日時:2023/05/17 12:56

A 回答 (5件)

入力した値が、整数型で扱える範囲を超えているのでは?



一般的に、32ビットの符号付き整数型で扱える値の範囲は、
-2,147,483,648 ~ 2,147,483,647

Microsoft Learn - データ型の範囲
https://learn.microsoft.com/ja-jp/cpp/cpp/data-t …


下記のようなプログラムで、intで扱える最大値を確認してみるとか、long型が使用可能なら使ってみるとか。

Webプログラミング入門 C言語入門 - 整数型(char型 int型)の最大値と最小値 - limits.h
https://webkaru.net/clang/limits-header/
    • good
    • 1
この回答へのお礼

ありがとうございます!

お礼日時:2023/05/17 14:03

>大きい実行結果で大きい値が異なってしまったのですがなぜなのでしょうか。


プログラムが想定した範囲外の「大きい値」が入力されたから
です。

詳細は他の回答者の通りで、int a と宣言した時点で、
 変数 a は、当該Cコンパイラが想定したaの値以外の入力に関しては、動作結果は保証しない
という約束を認めて使っているわけですよね。
    • good
    • 1

質問とは関係ありませんが



if (a > b)
{
  //ここの処理が終わっても、次の条件比較を行う
}
if (a < b)
{
  //ここの処理が終わっても、次の条件比較を行う
}
if (a == b)
{
}

は、間違いではありませんが、if条件に一致するスコープ内で、aやbを変更しないのであれば、最適化をしなければ、a>bの条件時に一致した後も、aとbの変数比較が行われるので、例えば、何度も処理を行うケースには、余計な処理を行うことになるので、下記のように変更した方がいいです

【推奨】
if (a > b)
{
  //ここの処理が終わったら、他の条件比較は行わず抜ける
}
else if (a < b) //上記以外の条件で、 a<bのが当てはまる時
{
  //ここの処理が終わったら、次の条件比較は行わず抜ける
}
else // 上記二つの条件以外の全て、if (a == b)
{
}

最後のelseがご自身で分かりにくければ、下記のように書いておけばいいと思います

else //if (a == b)
    • good
    • 1

数と内部表現の問題


16bit整数の場合、数値は-32768~+32767しか取れない。
先頭ビットを符号にし、マイナスは2の補数表現。
-1=0xffffffff

32bit整数の場合は、−2,147,483,648~2,147,483,647

32bit整数なら、変数をLong int宣言
64bit整数なら、変数をLong Longt宣言
    • good
    • 1

989,089,778,575,856


↓ 16進数
0003_8392_68E7_29F0
↓ signed int 型に収まる 32 bit の範疇に切り取り
68E7_29F0
↓ 10進数
1,759,980,016

大きい値を扱いたいならば
int → long long
%d → %lld
としては如何でしょうか。
参考)
https://learn.microsoft.com/ja-jp/cpp/c-runtime- …
    • good
    • 1
この回答へのお礼

ありがとうございます!

お礼日時:2023/05/17 14:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!