C言語関係掲示板

過去ログ

No.1057 long型を超える数値の扱い

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

long型を超える数値の扱い
投稿者---kz(2004/04/25 15:48:52)


初めて投稿させて頂きます。

C言語で、long型で扱える数値範囲を超える整数値を扱いたいのですが、
どのように考えたらいいのでしょうか。

ご教授、よろしくお願いいたします。




No.13748

Re:long型を超える数値の扱い
投稿者---YuO(2004/04/25 16:12:58)


>C言語で、long型で扱える数値範囲を超える整数値を扱いたいのですが、
>どのように考えたらいいのでしょうか。

long long型を使う。


No.13749

Re:long型を超える数値の扱い
投稿者---ぽこ(2004/04/25 16:13:11)


>C言語で、long型で扱える数値範囲を超える整数値を扱いたいのですが、
>どのように考えたらいいのでしょうか。

kzさんが使用している環境でlong型が扱える数値範囲はどのくらいなのでしょうか?
また、kzさんが扱いたい数値の範囲はどれくらいなのでしょうか?



No.13750

Re:long型を超える数値の扱い
投稿者---kz(2004/04/25 18:00:08)


皆様、早速のご回答ありがとうございます。

ぽこ様、
> kzさんが使用している環境でlong型が扱える数値範囲はどのくらいなのでしょうか?
環境:WinXP(home), BCC5.5 を使用
long型:32ビット
  signed  -2147483648 〜 2147483647
  unsigned 0 〜 4294967295
です。

> また、kzさんが扱いたい数値の範囲はどれくらいなのでしょうか?
64ビットまでのunsigned数値(0 〜 18446744073709551615)で考えております。
確かにYuO様に指摘いただいたとおりlong long型を用いれば実現できるのでしょうが、
今回は勉強のため、それを使わない方向で考えたいと思います。

そうした場合、たとえばunsigned long型変数を2つ使用して、1つは上位32ビットを、もう1つは
下位32ビットを扱うようにしたりして実現できないでしょうか?
よろしくお願いいたします。

(ちなみにlong long型ですが、BCC5.5では定義されていないみたいです。
コンパイル時に「エラー E2176 : 宣言に型が多すぎる」となりました。
ただlong long型と同じでしょうか。limits.hには__int64という型が定義されていました。)





No.13753

Re:long型を超える数値の扱い
投稿者---あかま(2004/04/25 18:48:27)


>そうした場合、たとえばunsigned long型変数を2つ使用して、1つは上位32ビットを、もう1つは
>下位32ビットを扱うようにしたりして実現できないでしょうか?
"多倍長"で調べてみるといいと思います。
過去ログにもいくつかサンプルがあります。


No.13766

Re:long型を超える数値の扱い
投稿者---たいちう(2004/04/26 10:41:32)


> そうした場合、たとえばunsigned long型変数を2つ使用して、1つは上位32ビットを、もう1つは
> 下位32ビットを扱うようにしたりして実現できないでしょうか?

便乗質問というか確認というか燃料なんですが、↑これは「不可能」ということで良いんですよね?

この方法がメモリの効率としては最適だと思いますが、単純な足し算の実装だけでも、
下位32ビットで繰上りがあったかどうかを調べる簡単な方法がない。あってます?
簡単でない方法としては、事前に繰り上がりの有無を調べておく方法が考えられますが、
signed と unsigned をうにゃうにゃ使ったら簡単にできるようなできないような。

# メモリなんてけちけちしないで多倍長というのが定石とは思いますが。
# 私ももっと考えてみますが、うにゃうにゃの部分とか、得意な人がいるような。


No.13767

Re:long型を超える数値の扱い
投稿者---YuO(2004/04/26 11:03:18)


>この方法がメモリの効率としては最適だと思いますが、単純な足し算の実装だけでも、
>下位32ビットで繰上りがあったかどうかを調べる簡単な方法がない。あってます?

無いです。
というか,オーバーフローが発生した場合の動作は未定義となっています。
定数式でない場合において,
int型が16bitの時の0xFFFFU + 1や,
long型が32bitの時の0xFFFFFFFFUL + 1,
long long型が64bitの時の0xFFFFFFFFFFFFFFFFULL + 1は,
何が起きてもおかしくない,ということです。
#大抵の処理系では0になるでしょうけど……。

ISO/IEC 9899:1999 6.5 Expression
5 If an exceptional condition occurs during the evaluation of an expression (that is, if the result is not mathematically defined or not in the range of representable values for its type), the behavior is undefined.




No.13768

Re:long型を超える数値の扱い
投稿者---たいちう(2004/04/26 11:46:13)


> 無いです。
> というか,オーバーフローが発生した場合の動作は未定義となっています。

YuOさんいつも有難うございます。未定義でしたか。
c = a + b については、下位32ビットのみ考えたとき、
((c < a) || (c < b)) のときに繰上りがあったといえるかなと思ったのですが。
大抵の処理系では問題なさそうですが、Cの規格以外に頼らないためには、
足し算の前に判断しないとならないですね。


No.13769

Re:long型を超える数値の扱い
投稿者---tetrapod(2004/04/26 12:08:43)


符号なし数の場合はOKです(符号付き数の場合は YuO さんの説明のとおり)
3.9.1 Fundamental Types 4 および注釈 41)
41) This implies that unsigned arithmetic types does not overflow because...



No.13770

Re:long型を超える数値の扱い
投稿者---かずま(2004/04/26 14:05:44)


> 符号なし数の場合はOKです(符号付き数の場合は YuO さんの説明のとおり)
> 3.9.1 Fundamental Types 4 および注釈 41)
> 41) This implies that unsigned arithmetic types does not overflow because...
それって、ISO/IEC 14882:1998 Programming Languages -- C++ ですよね。

今は、C言語について議論しているのだから、ISO/IEC 9899:1999 Programming
Languages -- C を参照するべきでしょう。私は、Web でひろってきたドラフト
しかもっていませんが、6.2.5 Types のところの 9段落目に、

  A computation involving unsigned operands can never overflow, because
  a result that cannot be represented by the resulting unsigned integer
  type is reduced modulo the number that is one greater than the largest
  value that can be represented by the resulting type.

とあります。

また、http://www.jisc.go.jp/ にいって、「JIS検索」のページで、X3010 を
入力すると、JIS X3010:2003 を読むことができます。

符号なし整数が絶対にオーバーフローしないのは、C99 になる前からそう決まっ
ています。



No.13778

Re:long型を超える数値の扱い
投稿者---YuO(2004/04/26 20:24:40)


>> 符号なし数の場合はOKです(符号付き数の場合は YuO さんの説明のとおり)
>> 3.9.1 Fundamental Types 4 および注釈 41)
> しかもっていませんが、6.2.5 Types のところの 9段落目に、

両方とも確認しました。私の勇み足でしたね。
お騒がせいたしました。



No.13787

Re:long型を超える数値の扱い
投稿者---たいちう(2004/04/27 11:45:34)


YuOさま、tetrapodさま、かずまさま有難うございました。

元の質問者はどうしちゃったのかな?
混乱させてしまったかもしれないので一応フォローを。

あかまさんが書いている通り、大きい整数や高精度の小数には『多倍長』が使えます。
応用できる範囲も広いので、調べてみることをお勧めします。


No.13796

Re:long型を超える数値の扱い
投稿者---kz(2004/04/27 22:25:04)


>あかまさんが書いている通り、大きい整数や高精度の小数には『多倍長』が使えます。
>応用できる範囲も広いので、調べてみることをお勧めします。

皆様、いろいろ教えていただきありがとうございました。
多倍長、初めて聞きました。
今まで知らなかった世界が見えたような、すごい楽しいです。
本でちらっと見てみましたが、なかなか難しそう。
少し独学で勉強してみます。
またわからないことがあったらよろしくお願いします。