10
votes

N'y a-t-il pas un opérateur en C pour changer le signe d'un flotteur INT, etc. de négatif à positif ou inversement?

Essayer de trouver une valeur absolue et je pensais qu'il y avait un moyen simple de simplement inverser le signe avec '~' ou quelque chose.


2 commentaires

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


Je ne connais pas l'objectif-C, mais basé sur votre question, il y a probablement une fonction de bibliothèque pour obtenir la valeur absolue ... Mukeding avec le signe serait un code qui mène à moi.


8 Réponses :


13
votes

Pour inverser le panneau, mettez un moins devant celui-ci.


2 commentaires

@Windows Programmer: "Vous auriez dû le sortir comme je l'ai fait." Merci pour ça.


C'est le plus élégant de tous. Jolie auto-explicite.



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

1 commentaires

Vous obtiendrez un avertissement entièrement inutile si vous utilisez simplement -oldValue, au moins dans MSVC.



4
votes

-x vous donnera la valeur non inversée de x.


0 commentaires

1
votes

x = 0 - x;

? Ou dois-je manquer le point?


0 commentaires

8
votes

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

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


1 commentaires

Je viens de voir que ceci est tagué objectif-c. Je m'étais initialement anthropiale par rapport au titre, demandant un opérateur "en C". Heureusement, "Objective-C est une couche mince sur C, et en outre est un superset strict de C. Il est possible de compiler tout programme C avec un compilateur de l'objectif-C et d'inclure librement Code C dans un objectif-c classer." en.wikipedia.org/wiki/Objective-c



12
votes

Négation simple avec - fonctionne, mais la plupart des réponses ont ignoré le fait que l'OP tente de faire de la valeur absolue. Pour cela, l'outil correct est ABS () pour les entiers et fabs () pour des flotteurs. Le code sera cristallin et le résultat sera ce que vous attendez. (Edit: Assurez-vous de lire la documentation et les bogues de ces outils. Comme Nick pointe, nier le nombre le plus négatif avec ABS () renvoie le même nombre négatif.)


5 commentaires

En principe, je suis d'accord et j'ai fait voté votre réponse. Bien sûr, on pourrait raisonnablement s'attendre à ce que le programme soit résilié, ou une exception à soulever, en essayant de nier l'entier le plus négatif. Voir Bugs dans la documentation liée pour ABS ().


@Nick: ABS () ne piège pas sur l'iPhone; Il va juste retourner int_min.


@Nick: Ce n'est pas dans l'esprit C. Comme Stroustrup a dit dans un cas similaire pour C ++, la langue devrait fournir l'opérateur rapide et peut-être l'opérateur coché. Si la langue fournit l'opérateur rapide, l'utilisateur peut insérer des chèques au besoin, tandis que si la langue fournit uniquement l'opérateur coché, l'utilisateur n'a aucun moyen de supprimer les chèques lorsqu'il est inutile et de le faire rapidement. Vous pouvez toujours écrire int coché_abs (int) si vous le souhaitez.


@David: Je ne suis pas en désaccord. Mon point était juste que vous pourriez avoir une raison légitime d'écrire votre propre ABS (): pour piéger cette erreur.


@Stephen: Je pense que vous avez mal interprété mon commentaire. Je disais que bien que ABS () ne pièche pas, un utilisateur pourrait s'attendre à ce que ce soit. C'était en ce qui concerne la déclaration selon laquelle "le résultat sera ce que vous attendez".



4
votes

sujet délicat. La voie directe de modifier le signe sur un numéro de point flottant consiste à renvoyer la valeur du bit le plus significatif de la variable. La notation énumérée dans les autres réponses est à la merci du compilateur, qui est généralement bien, mais pas toujours. Pour "flotteur x", la réponse est la suivante:

* (non signé INT *) & x ^ = (1 << 31)

Si vous écrivez pour quelque chose comme l'iPhone, qui possède un processeur Cortex A8 (ou quelque chose du genre), vous souhaitez éviter les doubles et éviter les conditionnels lorsque vous travaillez avec des flotteurs dans des boucles intérieures. Donc, vous pouvez faire cela:

* (non signé INT *) & x ^ = (x <0) << 31);

qui transformera les négatifs aux positifs sans utiliser d'instruction de branche. Si cela se trouve 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 souciez probablement pas trop!


0 commentaires

-1
votes

C'est une solution de merde, je ne sais pas ce qui s'est passé ici. Voir la réponse ci-dessous avec ABS () pour le bon.

Même s'il s'agit d'une question ancienne, peut-être que cette réponse aidera certaines d'entre vous. Je voulais avoir une valeur positive ou négative d'un nombre basé sur un autre résultat (disons un mustbénégatif booléen) de la manière dont je l'ai fait est: xxx

Le nombre sera son valeur positive ou négative basée sur la valeur "mustbenegative". Lorsque le numéro était déjà un nombre négatif, il deviendra positif et visa versa.


2 commentaires

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


Oui, je ne sais pas ce qui s'est passé là-bas. Si quelqu'un demande, quelle est la chose sur Internet que vous avez la plus honte de? Je vais souligner cette réponse à partir de maintenant.