tuxtof
August 19, 2010, 10:41pm
1
bonsoir
j'ai un comportement bizarre que je n'arrive pas a m'expliquer
j'avais commencer par me retrouver avec la chose suivante
int var = 164 * 200 / 200; qui me donnait un -163 du au dépassement de limite même si je ne m'expliqe pas la valeur exacte
ensuite j'ai fait
unsigned int = 164 * 200 / 200; qui me donne 65373 et la je comprend plus
une bonne âme peut t'il tenter de m'expliquer
merci d'avance
flaith
August 20, 2010, 6:06am
2
int (entier signé) valeur : de -32 768 à 32 767
unsigned int (entier non signé) valeur : de 0 à 65 535
Ce qui est bizarre c'est le comportement, normalement cela devrait être codé sur 32bits et no sur 16bits, soit :
int : -2 147 483 648 à 2 147 483 647
uint : 0 à 4 294 967 295
:o
flaith
August 20, 2010, 6:18am
3
un test rapide (gcc) :
#include <stdio.h>
int main()
{
int i;
unsigned int j;
i = 164 * 200 / 200;
j = 164 * 200 / 200;
printf("i = %i\n",i);
printf("j = %u\n",j);
return 0;
}
me donne 164 pour les deux :-?
Y'a un truc pas net :o
Le type int est un 16bits sur la plateforme arduino
164 = 0xA4
200 = 0xC8
0xA4 x 0xC8 = 0x8020 // valeur négative
0x8020 / 0xC8 = 0xFF5D
Ce résultat, évalué comme un int donne -163
Ce résultat évalué comme un unsigned int donne 65373
unsigned int = 164 * 200 / 200; qui me donne 65373 et la je comprend plus
Dans ce cas là, seul le résultat est unsigned. Les éléments du calcul ont le type par défaut int.
il faudrait faire ça
unsigned int var = (unsigned int)164 * (unsigned int)200 / (unsigned int)200;
Pour avoir le bon résultat, il faut faire:
unsigned int var = (unsigned int)(164L * 200L / 200L);
Le calcul est réalisé en long donc pas de perte de précision et le résultat est converti dans le bon type
Une variante avec le calcul en flottant:
unsigned int var = (unsigned int)(164.0 * 200.0 / 200.0);
tuxtof
August 20, 2010, 11:02am
5
Ok je commence à comprendre
mais alors comment l'espace de calcul est défini quand il ya plusieurs variable de type différent
par ex
unsigned int steps = 200;
unsigned int delta = 200;
int i = 164;
byte var = i * delta / steps;
qu'elle va être l'espace de calcul ?? dans tous les cas je veux stocké 164 dans var.