带有无符号字符的模数运算符
试图让一些代码工作,模数不想做我想做的事……这意味着我错了。
我有unsigned char
,我正在尝试分隔小时/分钟/秒,所以我可以在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);
minutes =(secs/60.0)-(hours*3600);
应该
minutes =(secs/60.0)-(hours*60);
除此之外,它适用于足够小的输入: http : //ideone.com/VPKP1
但是有一些事情我会改变。 例如,没有必要进行双重除法,然后将结果分配回unsigned char
,您也可以进行整数除法。
你提到它是一个嵌入式程序。
seconds = secs-(hours*3600)-(minutes*60);
hours
是一个unsigned char
,在表达hours*3600
提升为int
。
如果你正在使用16位int
你将遇到上述问题。 在二进制补码系统中,16位int
范围从-32768
到32767
,这意味着当hours
>= 10
时你有溢出。
首先,你使用double
计算,因为你使用的是double
常量。
那么模数计算将不会作为unsigned char
因为它是一种窄类型。 通常它会首先被提升为int
,然后进行计算。
通常,通过直接对所有变量使用unsigned int
可以获得更好的效果。 char
类型仅在您想要节省空间时才有用。
你的程序写的很糟糕,尝试这样做,它运行正常
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 );