Question

Je le code suivant:

NSInteger index1 = (stop.timeIndex - 1);  //This will be -1
index1 = index1 % [stop.schedule count];  // [stop.schedule count] = 33

J'ai donc l'expression -1% 33. Cela devrait me donner 32, mais au lieu de me donner 3 ... Je l'ai vérifié deux fois les valeurs dans le débogueur. Est-ce que quelqu'un a des idées?

Était-ce utile?

La solution

C99 dit à la section 6.5.5 opérateurs multiplicatifs (mine de gras):

  

Le résultat de l'opérateur de / est le quotient de la division du premier opérande par le   seconde; le résultat de l'opérateur % est le reste . Dans les deux opérations, si la valeur de   le second opérande est égal à zéro, le comportement est indéfini.

     

Lorsque des nombres entiers sont divisés, le résultat de l'opérateur de / est le quotient algébrique avec toute   partie fractionnaire mis au rebut. Si le a/b quotient est représentable, l'expression   (a/b)*b + a%b est égale a.

Il dit que % est le reste, et ne pas utiliser le mot « module » pour le décrire. En fait, le mot « module » ne se produit que dans trois endroits dans ma copie de C99, et ceux se rapportent tous à la bibliothèque et à aucun opérateur.

Il ne dit rien qui exige que le reste soit positif. Si un reste positif est nécessaire, la réécriture a%b que (a%b + b) % b fonctionnera soit pour signe de a et b et donner une réponse positive au détriment d'un ajout supplémentaire et la division. Il peut être moins cher de le calculer comme m=a%b; if (m<0) m+=b; selon que les branches manquées ou divisions supplémentaires sont moins chers dans votre architecture cible.

Modifier Je ne sais rien à propos de Objective-C. Votre question initiale a été étiqueté C et toutes les réponses à ce jour reflètent le langage C, bien que votre exemple semble être le code Objective-C. Je suppose que savoir ce qui est vrai à propos de C est utile.

Autres conseils

En C, l'opérateur de module ne fonctionne pas avec les nombres négatifs. (Il donne un reste, plutôt que de faire l'arithmétique modulaire comme son nom l'indique commun.)

Les résultats de l'utilisation de l'opérateur mod sur les nombres négatifs sont souvent inattendues. Par exemple, ceci:

#include <stdio.h>

int main() {
    int n = -1 %  33;
    printf( "%d\n", n );
}

produit -1 avec GCC, mais je ne vois pas pourquoi vous vous attendez l'expression d'évaluer à 32 - il va. Il est normalement préférable de ne pas effectuer de telles opérations, en particulier si vous voulez que votre code soit portable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top