C言語関係掲示板

過去ログ

No.1021 サイズが足りず演算できない場合

[戻る] [ホームページ]
No.1466

演算について
投稿者---ROXY(2004/03/11 13:51:40)


初めまして、勉強中のサラリーマンです。以下のプログラムで、
2回目の表示が32768となる理由について、どなたか教えて頂け
ないでしょうか?65536を乗算で使用していますが、手計算で解く
手法がわかりません(ビットレベルで考えるのでしょうか?)。
よろしくお願いします。

#include <stdio.h>

int main(void)
{
int i;
i = 65536;
printf("i = %d\n", i);
i = i * (i + 1) / 2;
printf("i = %d\n", i);
return 0;
}

[出力結果]
1番目:65536
2番目:32768
となる理由がわかりません。

No.1468

Re:演算について
投稿者---ともじ(2004/03/11 14:10:24)


>初めまして、勉強中のサラリーマンです。以下のプログラムで、
>2回目の表示が32768となる理由について、どなたか教えて頂け
>ないでしょうか?

こういった問題は、お使いの環境を明示くださるようにお願いいたします。
また、掲示板1と2の回答者はほぼ共通ですから、多重投稿もお控えください。

intが4バイトの処理系では、
    i = 65536;
    i = i * (i + 1) / 2;
の計算はサイズが足りず計算できません。
http://www9.plala.or.jp/sgwr-t/c_sub/TypeConversion.html
にありますように、処理系依存の型変換が生じます。
結果から見ますに、
    A : 65536 * 65537 / 2
    B : 2147483647
    A % (Bの型の表現しうる最大値+1) = 4295032832 % 2147483648
の計算をして変換しているようです。


No.1471

Re:演算について
投稿者---ROXY(2004/03/11 14:43:45)


今回、掲示板に初めて投稿したもので、ルールがわかっておりませんでした。失礼なことをいたしまして、大変申し訳ありませんでした。

ともじさんのアドバイスでなんとか計算方法がわかりました。
ただ、なぜこの方法で結果が得られるかはもう少し考える必要があると
感じました。

ありがとうございました。

No.1472

Re:演算について
投稿者---NykR(2004/03/11 19:27:22)


>int i;
>i = 65536;
>printf("i = %d\n", i);
>i = i * (i + 1) / 2;
>printf("i = %d\n", i);

>[出力結果]
>1番目:65536
>2番目:32768
>となる理由がわかりません。

符号付き整数型の値が、その型で表現できなかった場合にどうなるかは処理系定義です。ですから、そのような出力になる理由はコンパイラのマニュアルを見ないとわかりません。