4

2 つの数値を乗算したいのですが、数値が常に正であることがわかっている場合は、次のようになります。

unsigned int mulPositiveNumbers(unsigned int a ,unsigned int b)
{
    assert(a > 0);
    assert(b > 0);
    return (a*b);
}

今、私は assert を使用して、「与えられた数値は常に正である」と自分に言い聞かせています。

しかし、私が実行すると:

int main()
{

    unsigned int res = mulPositiveNumbers(-4,3);

        // more stuff goes here

}

負の数を使用しているにもかかわらず、コードは失敗しません。なんで ?

4

5 に答える 5

7

aとは符号がないため、b負になることはありません。アサーションが失敗する唯一の方法は、アサーションの 1 つが 0 の場合です。

signed int をパラメーターとして関数を呼び出すと、関数が実行される前に (したがって、アサートがチェックされる前に) unsigned it に変換されます。負の整数を符号なしに変換すると、正の整数が生成されます。これは、前述したように、負の符号なし整数がないためです。

于 2012-08-29T09:58:04.913 に答える
3

負を使用していません。これはunsigned int、関数がパラメーターとして受け取るものであるため、に変換されます。

アサーションは、数値が の場合にのみ失敗する可能性があります0

于 2012-08-29T09:57:16.850 に答える
3

タイプ 'unsigned int' は暗黙的に -4 を unsigned に変換します

于 2012-08-29T09:57:24.427 に答える
1

unsigned (32 ビット) int として解釈される -4 は であるため4294967291、これは間違いなく正です。

以下は、意図したとおりに機能するはずです。

unsigned int mulPositiveNumbers(int a, int b)
{
    assert(a > 0); // Fail for (-4, 3)
    assert(b > 0);
    return (a*b);
}

その間、乗算の結果がオーバーフローするかどうかをアサートするか、より大きな戻り値の型 (例: long long )を選択する必要があります。

于 2012-08-29T10:09:27.770 に答える
0

これを試して:

(unsigned int a ,unsigned int b)
于 2012-08-29T09:57:34.723 に答える