试图让一些代码工作,模数不想做我想做的事......这意味着我错了。
我有unsigned char
s我试图将小时/分钟/秒分开,以便我可以在Ascii的屏幕上显示它们。
变量secs
是unsigned 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);
答案 0 :(得分:2)
minutes =(secs/60.0)-(hours*3600);
应该是
minutes =(secs/60.0)-(hours*60);
除此之外,它适用于足够小的输入:http://ideone.com/VPKP1
但有些事情我会改变。例如,没有必要进行双重除法,然后将结果分配回unsigned char
,您也可以进行整数除法。
答案 1 :(得分:1)
你提到它是一个嵌入式程序。
seconds = secs-(hours*3600)-(minutes*60);
hours
是unsigned char
在表达式int
中提升为hours*3600
。
如果您使用的是16位int
,则上述行会遇到问题。在二进制补码系统中,16位int
范围从-32768
变为32767
,这意味着当hours
为>= 10
时,您会出现溢出。
答案 2 :(得分:0)
首先,您使用double
进行计算,因为您使用的是double
常量。
然后模数计算不会以unsigned char
完成,因为它是一种窄类型。通常它会首先被提升为int
,然后计算将完成。
通常情况下,您可以直接使用unsigned int
来表示所有变量。 char
类型仅在您想要节省空间时才有用。
答案 3 :(得分: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 );