2014-09-06 16 views
5

Tôi nhận phép chia cho không lỗi ở dòng này:gcc: phép chia cho không

if (tim2_st_ovf < T2_PREK_250) 

Những giá trị này là định nghĩa như thế này:

volatile uint8_t tim2_st_ovf = 0; 

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

UINT8_MAX tương đương với 255.

Tại sao tôi nhận được thông báo này? Tôi tính toán nó nhiều lần trên máy tính và nhận được ~ 15. Ngoài ra, nếu tôi thay đổi 1024 đến 1023 nó không hiển thị bất kỳ lỗi nào.

+0

Vui lòng đăng http://sscce.org/ (bao gồm chức năng 'main'). – pts

Trả lời

7

((UINT8_MAX + 1) * 1024) có thể trở thành 0, bởi vì UINT8_MAX + 1 thường là 256 và 256 * 1024 là 0 modulo 2 . Vì vậy, nếu sizeof(int) == 2 trên achitecture của bạn, sau đó bạn sẽ có được 0.

Trên kiến ​​trúc máy tính để bàn hiện đại điển hình với GCC, sizeof(int) == 4, và bạn sẽ không nhận được phân chia bởi 0.

Để khắc phục nó, thay thế 1024 với 1024UL . Điều đó sẽ hoạt động, bởi vì unsigned long được đảm bảo để lên tới 4294967295. (Cảm ơn Pascal Cuoq đã giải thích nó.)

+0

Tuyệt vời, cảm ơn giải pháp và lời giải thích! Tôi sẽ chấp nhận anwser càng sớm càng tốt. – user1806687

+0

Tôi muốn nói rằng điều này được sao lưu bởi thực tế là '16000000' được đánh dấu bằng' UL' trong dòng tiếp theo, trong khi điều này sẽ thoải mái phù hợp với số nguyên 32 bit (điều này cũng ngụ ý rằng 'ULL' thực sự là quá mức cần thiết trên nền tảng này). – Dave

+1

'unsigned long' được đảm bảo để đi tới' 4294967295', do đó không có cách nào thay thế '1024' bằng '1024UL' có thể không hoạt động. –

Các vấn đề liên quan