3

次のコードを検討してください。

unsigned int var1 = 4294967295;

unsigned int var2 = 1000000;

unsigned int var3;

var3 = some_expression - (var1*var2)/some_expression;

バグ:

var3 の式の値:

(var1*var2) は 32 ビット整数に切り捨てられます (2 つの 32 ビット整数を乗算して取得されるため)。

考えられる修正:

var3 = some_expression - ((unsigned long int)var1*var2)/some_expression;

問題:

Solarisはこの型キャストを受け入れず、次のエラーをスローします。

「非スカラー型への変換が要求されました」

型キャストせずにこの問題を修正できますか?

4

3 に答える 3

1

中間変数を導入します。

unsigned int var1 = 4294967295U;
unsigned int var2 = 1000000U;
unsigned int var3;

{
  unsigned long int vartmp = var1;
  vartmp *= var;

  var3 = some_expression - vartmp/some_expression;
}
于 2012-11-10T10:31:35.553 に答える
0

より良い方法が必要ですが、私の数論者は、共通の要因を見つけて、共通の要因をキャンセルしようとvar1 var2言っています。some_expressionこのソリューションは、発生しない可能性のあるいくつかの要因を共有することを条件としています。

私が考えることができる他の唯一のことは、ある種のシミュレートされたlong longbig int型の数学を行うことであり、それは厄介になる可能性があります。

于 2012-11-10T03:52:04.420 に答える
0

明示的な型キャストがなくても、次のように実行できます。

unsigned long tmp = var1;
var3 = some_expression - (tmp * var2) / some_expression;

unsigned long(より大きなタイプを想定unsigned int)これは、「可能な修正」とほぼ同じです。

ただし、「可能な修正」はそれ自体で機能するはずです。自尊心のあるコンパイラがあなたの表現に応じてそのようなエラーメッセージを生成するとは思わない。このエラーメッセージを生成する実際のコードを投稿してください。

実際、私は1、2日前にここですでに尋ねられた非常によく似た質問を覚えています。その場合、コードの作成者は、 typedefが型を参照しているのに対し、実際にはtypedefが型を参照しているのに対し、UL64それがの略であると信じるようなtypedef-ed型に型キャストしていました。それがエラーメッセージの原因でした。unsigned long intstruct

于 2012-11-10T03:54:28.013 に答える