2014-09-06 17 views
5

sto ottenendo divisione per zero errore in questa linea:gcc: divisione per zero

if (tim2_st_ovf < T2_PREK_250) 

Questi valori sono definisce in questo modo:

volatile uint8_t tim2_st_ovf = 0; 

#define T2_PREK_250 ((250 * (F_CPU/1000))/((UINT8_MAX + 1) * 1024)) 
#define F_CPU 16000000UL 

E UINT8_MAX uguale a 255.

Perché sto ricevendo questo? L'ho calcolato più volte sulla calcolatrice e ho ottenuto ~ 15. Inoltre, se cambio 1024 a 1023 non mostra alcun errore.

+0

Per favore pubblica un http://sscce.org/ (inclusa la funzione 'main'). – pts

risposta

7

((UINT8_MAX + 1) * 1024) può divenire 0, perché UINT8_MAX + 1 è generalmente 256, e 256 * 1024 è 0 modulo 2 . Quindi, se sizeof(int) == 2 sul achitecture, poi si arriva a 0.

Sulle tipiche architetture desktop moderno con GCC, sizeof(int) == 4, e non si otterrebbe la divisione per 0.

Per risolvere il problema, sostituire 1024 con 1024UL . Funzionerà, perché è garantito che l'unsigned long salga a 4294967295. (Grazie a Pascal Cuoq per spiegarlo.)

+0

Fantastico, grazie per la soluzione e la spiegazione! Accetterò il fallito il più presto possibile. – user1806687

+0

Direi che questo è supportato dal fatto che '16000000' è contrassegnato con' UL' nella riga successiva, mentre questo si adatterebbe comodamente all'interno di un intero a 32 bit (questo implica anche che 'ULL' sarebbe davvero eccessivo su questa piattaforma). – Dave

+1

'unsigned long' è garantito fino a '4294967295', quindi non c'è modo che la sostituzione di' 1024' con '1024UL' possa non funzionare. –

Problemi correlati