つまり、これは期待どおりに機能しますか?32bit int * 32bit int = 64ビットint?
int32 i = INT_MAX-1;
int64 j = i * i;
または64ビットを先にキャストする必要がありますか?
つまり、これは期待どおりに機能しますか?32bit int * 32bit int = 64ビットint?
int32 i = INT_MAX-1;
int64 j = i * i;
または64ビットを先にキャストする必要がありますか?
オペランドの少なくとも1つを乗算にキャストする必要があります。乗算が実行されている時点で、システムはint64に代入する予定があることを知らない。
それは何INT32およびInt64のあるに依存
一般的なトリックでは、1Lを最初に乗算していますキャストの: int64 j = 1L * i * i; あなたのロングが64ビット長の場合、これは機能します。 – stepancheg
'long 'が32ビットしかない場合は、最新のコンパイラで1LLを使用できます。 –
または、stdint.hのINT64_C(1)を使用して、それを適度に移植可能にすることができます(MSコンパイラのstdint.hを掘り起こす必要があります。おそらくMinGWまたはhttp://www.azillionmonkeys.com/qed/から入手できます)。 pstdint.h –
(int64型は、実際にはそう思えるあなたの特定のシステムのネイティブint型でない限り)。
簡潔に言えば、すべての整数は、算術演算の前に少なくとも 'int'サイズ(64ビットでもよい)に、また、これがintより大きいランクの場合、バイナリ演算子のためのより大きいオペランドのサイズ。
式の結果がどのように使われるか(より広い型に格納されているかどうか)は、式の構成部分の宣伝には関係しません。
+1の代わりに説明するために –
与えられた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のようなものを使用して、数値をバイナリ形式に変換し、使用するビット数を数えることを確認するための迅速な健全性チェックが必要な場合のみです。
基本的な答えは、あなたがしたいことはしません。
しかし、それは期待されることをします。数学演算について注意する
2つのこと:
コンパイラがオペランド間の不一致を記録すると、どちらかのオペランドが一致するように変換されます(Which variables should I typecast when doing math operations in C/C++?参照)。注:これは、結果に何が起こるかとは別に行われます。
参照:単純整数型とmemsize型の混在使用。 http://www.viva64.com/art-1-2-599168895.html
これは予想通りですが、ディーンは何が起こっているかについては正しいと思いますが、それはおそらくあなたが期待するものではありません。 –
http://stackoverflow.com/questions/245740/which-variables-should-i-typecast-when-doing-math-operations-in-cc/245986#245986 –