2010-01-08 4 views
7

en essayant de trouver la valeur absolue et je pensais qu'il y avait un moyen simple d'inverser le signe avec '~' ou quelque chose.n'y at-il pas un opérateur dans c pour changer le signe d'un flottant int etc de négatif à positif ou vice versa?

+0

Et si c'est déjà négatif? ils vont annuler? – nickthedude

+0

Je ne connais pas l'objectif-c, mais en fonction de votre question, il y a probablement une fonction de bibliothèque pour obtenir la valeur absolue ... le déblayage avec le signe serait une odeur de code pour moi. – overslacked

Répondre

20
float newValue = oldValue * -1; 

ou

float newValue = -(oldValue); //() aren't needed, I just use them out of habit 
10

Pour inverser le signe, placez un signe négatif devant celui-ci.

+0

Est-ce que le downvoter s'il vous plaît laissez un commentaire. Merci. –

+0

2 downvotes sans raison? Allons! –

+0

Le titre demande la négation en C, le contenu de la question demande une valeur absolue, et ailleurs l'affiche dit Objective C au lieu de C. Vous ne pouvez pas vous attendre à ce que votre réponse satisfasse tout le monde. Ou n'importe qui. Ou même l'affiche originale. Vous auriez dû rester à l'écart comme je l'ai fait. –

4

-x vous donnera la valeur inversée du signe de x.

1

x = 0 - x;

? ou est-ce que le point me manque?

8

L'opérateur de négation unaire -(expr) fait exactement ce que vous voulez.

int x = -7; 
int y = 7; 
x = -x; // x is now 7 
y = -y; // y is now -7 

L'opérateur du complément ~(expr) que vous bitwise mentionnez, d'autre part, flips tous les bits de l'entrée. Dans le cas où cela serait utile, un problème que de nombreuses implémentations de valeurs absolues dans la nature ignorent est que la négation de la valeur la plus négative d'un type entier de complément à deux fixe de taille fixe dépassera.

+0

bonne réponse ... –

+0

Je viens de voir que cela est étiqueté objectif-c. J'avais initialement répondu par rapport au titre, demandant un opérateur "en C". Heureusement, "Objective-C est une couche mince au-dessus de C, et est en outre un sur-ensemble strict de C. Il est possible de compiler n'importe quel programme C avec un compilateur Objective-C, et d'inclure librement du code C dans un Objective-C classe." http://en.wikipedia.org/wiki/Objective-C –

12

La négation simple avec - fonctionne, mais la plupart des réponses ont ignoré le fait que l'OP essaie de faire une valeur absolue. Pour cela, l'outil correct est abs() pour les entiers et fabs() pour les flottants. Le code sera clair et le résultat sera ce que vous attendez. (Editer: Assurez-vous de lire la documentation et les bogues pour ces outils.) Comme Nick le fait remarquer, la négation du nombre le plus négatif avec abs() renvoie le même nombre négatif.)

+0

En principe, je suis d'accord et j'ai voté votre réponse. Bien sûr, on peut raisonnablement s'attendre à ce que le programme soit terminé, ou qu'une exception soit soulevée, lorsqu'on essaie de nier l'entier le plus négatif. Voir BOGUES dans la documentation liée pour abs(). –

+0

@Nick: 'abs()' ne piège pas sur l'iPhone; il retournera simplement INT_MIN. –

+0

@Nick: Ce n'est pas dans l'esprit C. Comme Stroustrup l'a dit dans un cas similaire pour C++, le langage devrait fournir l'opérateur rapide, et peut-être l'opérateur vérifié. Si la langue fournit l'opérateur rapide, l'utilisateur peut insérer des contrôles si nécessaire, tandis que si la langue ne fournit que l'opérateur coché, l'utilisateur n'a aucun moyen de rejeter les contrôles lorsqu'il est inutile et de le faire rapidement. Vous pouvez toujours écrire 'int checked_abs (int)' si vous le souhaitez. –

3

Sujet difficile. La manière directe de modifier le signe sur un nombre à virgule flottante consiste à inverser la valeur du bit le plus significatif de la variable. La notation listée dans les autres réponses est à la merci du compilateur, ce qui est généralement bien, mais pas toujours. Pour « x float », la réponse est:

*(unsigned int*)&x ^= (1<<31)

Si vous écrivez quelque chose comme l'iPhone, qui dispose d'un processeur Cortex A8 (ou quelque chose comme ça), vous voulez éviter doubles et aussi éviter conditionnelles lorsque vous travaillez avec des flotteurs dans des boucles internes. Donc, vous pouvez le faire:

*(unsigned int*)&x ^= ((x<0) << 31);

qui tourneront négatifs à positifs sans utiliser une instruction de branchement. Si c'est dans une boucle interne, il sera 5 à 20 fois plus rapide que d'utiliser une autre méthode, sur l'iPhone. Si ce n'est pas dans une boucle intérieure, alors vous ne vous en souciez probablement pas trop!

-1

Ceci est une solution merdique, pas sûr de ce qui s'est passé ici. Voir la réponse ci-dessous avec abs() pour le bon.

Même si c'est une vieille question, peut-être que cette réponse aidera certains d'entre vous.Je voulais avoir une valeur positive ou négative d'un nombre basé sur un autre résultat (permet de dire un booléen mustBeNegative) la façon dont je l'ai fait est:

int number = 7; 
if(mustBeNegative) 
{ 
     number = number * 1; 
} 
else 
{ 
     number = number * -1; 
} 

Le nombre sera sa valeur positive ou négative en fonction de la " Valeur "mustBeNegative". Lorsque le nombre était déjà un nombre négatif, il devient positif et vice versa.

+0

Ceci est trop complexe et incorrect en même temps. – fishinear

+0

Oui, je ne suis pas sûr de ce qui s'est passé là-bas. Si quelqu'un vous demande, quelle est la chose sur Internet dont vous avez le plus honte? Je vais pointer vers cette réponse à partir de maintenant. – Matthijn

Questions connexes