2016-03-27 7 views
0

マイクロソフトのVisual Studio 2015には、次のコード:C++否定し、オーバーロードの解決

foo 

Error: more than one instance of overloaded function "function" matches the argument list: 
    function "foo(int8_t a)" 
    function "foo(int16_t a)" 
    argument types are: (int) 

はここで何が起こっている:

void foo(int8_t a); 
void foo(int16_t a); 
void foo(int16_t a, int16_t b); 

void f() 
{ 
    int8_t x /* = some value */; 
    foo(-int16_t(x)); // ERROR 
} 

は、次のようなメッセージを与えますか? "引数の型は:(int16_t)"と言うべきではありませんか?これには何かプロモーションがありますか?もしそうなら、私はどのようにプロモーションをオフにできますか?

+0

整数を否定すると、整数に変換されます。どのような変換が正確に必要ですか(型変換と否定の両方) –

+0

私は16ビット整数に 'x'を符号拡張し、その2の補数をとり、foo(int16_t a)に渡します。 そして私はコンピュータ上で32ビットのビットを持ちますが、なぜ世界で16ビット整数の否定が32ビット整数であるのでしょうか? – Isaac

+0

キャストする前に否定します。否定は、32ビット整数に昇格します。 –

答えて

1

キャストする前に否定します。ネゲートは、マシンサイズの整数に、したがってあいまいさを促進します。

foo(int16_t(-x)); 
1

あなたは整数プロモーション忘れています。すべての算術演算子は、算術演算を行っているオペランドに対して整数昇格を実行します。任意aための発現-a

aに適用され整数キャンペーン。これの効果は、aintより小さい整数型の場合、値がintに昇格されることです。従って-(int16_t)x-(int)(int16_t)xを意味し、システム上の

intは32ビットであるので、int16_tが狭くなっています。

16ビットの精度で否定を行う場合はできません。 intの精度でそれを行い、その結果を16ビットに戻す必要があります。

この場合、foo((int16_t)-x)は最も簡単な方法ですが、一般にあなたが否定していることを考えます。ここで-x-(int)xですが、この場合はおそらくあなたがしたいことでしょう。私たちが符号なしの型を使用していた場合は、もっと注意が必要です。

関連する問題