2009-04-19 16 views
6

つまり、これは期待どおりに機能しますか?32bit int * 32bit int = 64ビットint?

int32 i = INT_MAX-1; 
int64 j = i * i; 

または64ビットを先にキャストする必要がありますか?

+2

これは予想通りですが、ディーンは何が起こっているかについては正しいと思いますが、それはおそらくあなたが期待するものではありません。 –

+0

http://stackoverflow.com/questions/245740/which-variables-should-i-typecast-when-doing-math-operations-in-cc/245986#245986 –

答えて

17

オペランドの少なくとも1つを乗算にキャストする必要があります。乗算が実行されている時点で、システムはint64に代入する予定があることを知らない。

それは何INT32およびInt64のあるに依存

+4

一般的なトリックでは、1Lを最初に乗算していますキャストの: int64 j = 1L * i * i; あなたのロングが64ビット長の場合、これは機能します。 – stepancheg

+3

'long 'が32ビットしかない場合は、最新のコンパイラで1LLを使用できます。 –

+1

または、stdint.hのINT64_C(1)を使用して、それを適度に移植可能にすることができます(MSコンパイラのstdint.hを掘り起こす必要があります。おそらくMinGWまたはhttp://www.azillionmonkeys.com/qed/から入手できます)。 pstdint.h –

7

(int64型は、実際にはそう思えるあなたの特定のシステムのネイティブint型でない限り)。

簡潔に言えば、すべての整数は、算術演算の前に少なくとも 'int'サイズ(64ビットでもよい)に、また、これがintより大きいランクの場合、バイナリ演算子のためのより大きいオペランドのサイズ。

式の結果がどのように使われるか(より広い型に格納されているかどうか)は、式の構成部分の宣伝には関係しません。

+0

+1の代わりに説明するために –

0

与えられた2つの数字a、bおよび各数字は、len_aおよびlen_bビットを使用する。

出力データ型には、少なくとも:len_aとlen_bビットが必要です。

上記のコードでは、INT_MAX - 1 = 0x7FFFFFFEは31ビットを使用するため、2つの31ビットの数値があります。その前に32ビットの乗算とオーバーフローを行うため、int64_tにその1つをタイプキャストする必要があります。 int64_tにキャストします。


固定小数点乗算に必要なビット数:

len_output = howManyBits(a * b) 
      = len_a + len_b 

アクションで上記のルールを表示する簡単な例:

a  = 7 
len_a = 3 

b  = 7 
len_b = 3 

c = a * b 
    = 49 (decimal) 
    = 0x31 (hex) 

len_c = howManyBits(0x31) 
     = 6 

あなたはビットをカウントする関数を書くことができます。または、Windows Calcのようなものを使用して、数値をバイナリ形式に変換し、使用するビット数を数えることを確認するための迅速な健全性チェックが必要な場合のみです。

3

基本的な答えは、あなたがしたいことはしません。
しかし、それは期待されることをします。数学演算について注意する

2つのこと:

  • 両方のオペランドが同じ型になります。
  • 結果の型は入力と同じになります。

コンパイラがオペランド間の不一致を記録すると、どちらかのオペランドが一致するように変換されます(Which variables should I typecast when doing math operations in C/C++?参照)。注:これは、結果に何が起こるかとは別に行われます。

関連する問題