2016-03-27 16 views
0

In Microsoft Visual Studio 2015 den folgenden Code ein:C++ Negation und Überladungsauflösung

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 
} 

gibt die folgende Meldung:

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) 

Was ist hier los? Sollte es nicht heißen "Argumenttypen sind: (int16_t)"? Hat das etwas mit Werbung zu tun? Wenn ja, wie kann ich Werbung deaktivieren?

+0

Das Negieren der Ganzzahl konvertiert sie in ein 'int'. Welche Art von Konvertierung möchten Sie genau (sowohl Typkonvertierung als auch Negation)? –

+0

Ich möchte es Zeichen 'X' zu einer 16-Bit-Ganzzahl, nehmen Sie die Zweier-Kompliment, und dann übergeben Sie es an foo (int16_t a) Und ich glaube Int ist 32-Bit auf meinem Computer, Warum also in der Welt ist die Negation einer 16-Bit-Ganzzahl eine 32-Bit-Ganzzahl? – Isaac

+0

Negieren Sie vor dem Casting. Negieren fördert zu einer 32-Bit-Ganzzahl. –

Antwort

1

Negieren Sie vor der Besetzung. Negieren fördert zu einer Maschinengröße Integer, daher die Mehrdeutigkeit.

foo(int16_t(-x)); 
1

Sie vergessen über die integer Promotions. Alle arithmetischen Operatoren führen an den Operanden, die arithmetische Operationen ausführen, ganzzahlige Promotionen durch.

Im Ausdruck -a, für jede a die integer aktionen sind a angewendet. Dies hat zur Folge, dass, wenn a ein ganzzahliger Typ ist, der enger als int ist, der Wert auf int hochgestuft wird.

Auf Ihrem System int ist 32-Bit, so int16_t schmaler daher -(int16_t)x bedeutet -(int)(int16_t)x.

Wenn Sie eine Negation in 16-Bit-Genauigkeit machen wollen: Sie können nicht; Sie müssen es in int Präzision tun und dann das Ergebnis zurück in 16-Bit konvertieren.

In diesem Fall foo((int16_t)-x) ist der einfachste Weg, obwohl im Allgemeinen darüber nachdenken, was Sie negieren. Hier -x ist -(int)x aber in diesem Fall ist das vermutlich, was Sie tun möchten. Wenn wir unsignierte Typen verwenden, müssen Sie vorsichtiger vorgehen.