2017-10-06 4 views
-3

Je m'excuse si cette erreur est le résultat d'une faute de frappe, mais je n'arrive pas à comprendre comment rendre ma variable négative quand la syntaxe correcte devrait être y = -x;Comment rendre négatif une variable? C++

std::cout << "loop size = " << loop_size_ << std::endl; 
core::Size neg_loop_size_ = -loop_size_; 
std::cout << "neg loop size = " << neg_loop_size_ << std::endl; 

Quand je lance, cela est le résultat je reçois:

loop size = 4 
neg loop size = 18446744073709551612 

Comment puis-je obtenir une nouvelle variable égale à -4?

+5

Il est un type non signé qui est intégré pourquoi vous ne recevez pas une valeur négative. Le type de données de core :: Size doit être signé pour contenir l'entier natif – Asesh

+2

Il semble que 'core :: Size' soit un type entier * unsigned *, ce qui signifie qu'il ne peut jamais être" négatif ". Que se passe-t-il si vous essayez d'imprimer * '-loop_size_'? –

+0

Cela a du sens que c'est unsigned - core :: Size est un entier, destiné à quelque chose qui ne devient jamais négatif. Je vais utiliser un type de données différent ... Merci! – Amanda

Répondre

1

Ceci est sans aucun doute un problème de signature. Vous avez spécifié que neg_loop_size est core::Size. core::Size est probablement censé être une mesure de style de longueur. Une longueur ne peut pas être négative. ("Combien de kilomètres avez-vous couru aujourd'hui, Josy?", "Pourquoi, j'ai couru 4 kilomètres négatifs!")

Donc, le compilateur et cout forcent correctement -1 à "boucler" au plus grand nombre possible avec 8 octets. Tenir compte:

18446744073709551612 + 4 - 1 
= 2^65 -1 
= 0xFFFFFFFFFFFFFFFF 
= (core::Size) 0 - 1 

Si vous voulez une valeur négative, vous devrez soit faire une manipulation de chaînes et la conversion vous-même, ou choisir un type de données que le compilateur et cout interpréteront comme négatif. Par exemple:

int i = 0; 
i -= 1; 
std::cout << "i = " << i << std::endl; 
+0

Oui, core :: Size est exactement cela, une mesure de longueur. En utilisant int le fixe. – Amanda

0

Je pense que le problème est le type de données Core: Size est unsigned. Donc vous avez un problème.

Si vous stockez la valeur dans un entier, vous devez obtenir la sortie requise.

int main() { 
     int i = 5; 
     int j = -i; 
     cout<<endl<< j << endl; 

    return 1; 
} 

sortie ---

$>:~/tmp$ vim c.cpp 
$>:~/tmp$ g++ c.cpp 
$>:~/tmp$ ./a.out 
-5 
$