problème de calcul... basique mais je ne comprends pas.

Bonjour à tous,

je vous expose mon soucis :

connaître le nombre de secondes écoulées depuis minuit
simple, :confused: a priori oui :

uint32_t TimeS(int Hr, int Min, int Scd)
{
return((Hr3600) + (Min60) + Scd) ;
}

void setup() {

int H, M, S ;
uint32_t TenS = 0 ;

H = 24 ;
M = 0 ;
S = 0 ;

TenS = TimeS(H, M, S) ;
Serial.begin(9600) ;
Serial.print(" H = “) ;
Serial.println(H) ;
Serial.print(” min = “) ;
Serial.println(M) ;
Serial.print(” seconde = ") ;
Serial.println(S) ;
Serial.print("24h = ") ;
Serial.println(TenS) ;
}

void loop() {

}

mon bout de code devrait donc me retourner la valeur 24*3600 : 86400
ben non il me renvoie : 20864 :o
Quelqu’un a t il une explication ? Où est mon erreur ?

d’avance merci

Ludion (du village)

Bonjour,

Il faut faire le calcul en long

 return Hr*3600L + Min*60L + Scd;

Car le résultat excède la taille d'un int (32767)

merci Kamill

j'ignorais la subtilité, j'avais pourtant pris soin que le format du contenant un uint32_t soit bien "large".

Bonjour,

Les entier codés sur 16 bits (int) donnent des valeurs comprises entre -32768 et +32767.
lorsque tu fais: (Hr3600) le résultat est erroné à partir de Hr=9h.
Tu peux écrire (uint32_t)Hr
3600 afin de convertir Hr en un entier non signé sur 32bits.

Grillé par Kamill qui propose une autre solution, plus élégante.

Ludion:
j'ignorais la subtilité, j'avais pourtant pris soin que le format du contenant un uint32_t soit bien "large".

Oui mais en C/C++ ce n'est pas la variable de réception qui détermine la façon dont l'expression sera calculée, mais le type des opérandes

Ainsi dans:

int val=Hr*3600 + Min*60 + Scd;

ou

uint32_t val=Hr*3600 + Min*60 + Scd;

le calcul se fait en entier dans les deux cas car tous les opérandes sont entiers