2009-03-31 7 views
1

Je viens de réaliser que je reçois des erreurs sur les mathématiques simples si j'ai mélangé Integer avec des flottants dans l'iPhone SDK sur le simulateur. Deux exemples:iPhone Cocoa mode mixte Math Basic Erreurs

float testVal1 = 10 + 5/10; 
//evaluates to 10 instead of 10.5 unless I use explicit 10.0f.. 

// Problem Code mixed float int 
NSUInteger jvalue = 2312345; 

NSInteger testVal2 = (jvalue - 2512345); // evaluates correctly 
float testVal3 = (jvalue - 2512345); // fails with some huge bogus value 

Je pensais qu'en mode mixte, il serait converti en valeurs flottantes. On dirait que c'est tout ou rien en utilisant des flotteurs, pas de mélange

Qu'est-ce qui ne va pas ici?

Répondre

4

Rien ne va pas; C'est ainsi que fonctionnent les opérations. Jetez un oeil à votre exemple:

float testVal1 = 10 + 5/10; //evaluates to 10 

est ici la séquence des opérations ici:

  1. analyser 5: littéral entier
    • analyser 10: littéral entier
    • 5/10: entier division, résultat 0
    • 10 + [0]: addition entière, résultat 10
    • résultat Assigner à flotter

Pour faire ce travail comme vous le souhaitez, au moins un des opérandes de division doit être à virgule flottante. Le résultat sera désormais plus comme ceci:

  1. Analysons 5: littéral entier
    • analyser 10.0f: virgule flottante littérale
    • 5/10.0f: flottant point de division, entraîner 0,5
    • 10 + [0,5]: virgule flottante outre, entraîner 10,5
    • résultat assign flotter
+0

10.0 au lieu de 10.0f devrait fonctionner aussi. – sigjuice

2

Cela n'a rien à voir avec l'iPhone ou le simulateur, il a à voir avec la façon dont Objective-C et C effectuer des opérations arithmétiques. Le compilateur interprète les opérandes à 5/10 comme entiers et la division entière ne peut pas donner un résultat fractionnaire, par définition. Ainsi, 10 + 10 + 5/10 == 0 == 10. Vous pouvez essayer:

float testVal1 = 10.0f + 5.0f/10.0f; 
1

Le type de données par défaut dans un sous-expression comme 5/10 est entier jusqu'à ce que l'un des opérandes dit autrement. Cependant (5/10) = 0 en raison de la division entière.

Dans l'expression NSInteger testVal2 = (jvalue - 2512345);, le type de sous-expression par défaut est un entier non signé; votre résultat négatif provoque un débordement et une valeur fausse.