带有无符号字符的模数运算符

试图让一些代码工作,模数不想做我想做的事……这意味着我错了。

我有unsigned char ,我正在尝试分隔小时/分钟/秒,所以我可以在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); 

 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范围从-3276832767 ,这意味着当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 );