Problème d'arithmetique

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

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

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);

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.