2012-05-31 36 views
2

試圖讓一些代碼工作,模數不想做我想做的事......這意味着我錯了。模數運算符與無符號字符

我有unsigned char s,我試圖分開小時/分鐘/秒,因此我可以在Ascii屏幕上顯示它們。

變量secsunsigned int。其他一切都是unsigned char。我希望unsigned char的結果不要浪費記憶。在嵌入式環境中工作。

任何關心看代碼片段,並告訴我我做錯了什麼?

hours = secs/3600.0; 
minutes =(secs/60.0)-(hours*3600); 
seconds =secs-(hours*3600)-(minutes*60); 

sec_ones =(unsigned char)((seconds%10)); 
sec_tens =(unsigned char)((seconds-sec_ones)%100); 
min_ones =(unsigned char)(minutes%10); 
min_tens =(unsigned char)((minutes-min_ones)%100); 
hrs_ones =(unsigned char)(hours%10); 
hrs_tens =(unsigned char)((hours-hrs_ones)%100); 

回答

2
minutes =(secs/60.0)-(hours*3600); 

應該比

minutes =(secs/60.0)-(hours*60); 

其他,它爲足夠小,輸入:http://ideone.com/VPKP1

有一些東西,我會改變,雖然。例如,進行雙除法,然後將結果分配回unsigned char沒有意義,您可能只需進行整數除法。

0

第一,你因爲你正在使用double常量做double您計算。

那麼模量計算將不會作爲unsigned char完成,因爲它是一個窄類型。一般會首先將其升級爲int,然後進行計算。

通常情況下,您最好使用unsigned int直接用於所有變量。 char類型僅在您想要節省空間時纔有用。

+0

它是嵌入式編程,所以我們被告知要使用字符,除非我們有一個非常好的理由。 –

0

你的程序只是爛筆頭,儘量做到這一點,它運行正常

unsigned int secs = 5000; 
unsigned char sec_ones,sec_tens,min_ones,min_tens,hrs_ones,hrs_tens, hours, minutes, seconds; 

hours = secs/3600.0; 
minutes =(secs/60.0)-(hours*60); 
seconds =secs-(hours*3600)-(minutes*60); 

sec_ones =(unsigned char)((seconds%10)); 
sec_tens =(unsigned char)(seconds/10); 
min_ones =(unsigned char)(minutes%10); 
min_tens =(unsigned char)(minutes/10); 
hrs_ones =(unsigned char)(hours%10); 
hrs_tens =(unsigned char)(hours/100); 

printf("%.1u%.1u:%.1u%.1u:%.1u%.1u\n",hrs_tens,hrs_ones,min_tens,min_ones,sec_tens,sec_ones); 
+0

寫錯了嗎?永遠不會猜到這一點。我尋求幫助的好事。是的,您的回覆DID有幫助。我意識到一個計算錯誤。凌晨3點編碼從來不是一個好主意。謝謝。 –

1

你提到它是一個嵌入式程序。

seconds = secs-(hours*3600)-(minutes*60); 

hoursunsigned char在表達式hours*3600晉升爲int

如果你正在使用16位int你會遇到上述問題。在二進制補碼系統16位int範圍從-3276832767這意味着當hours>= 10時,您有溢出。