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

时间:2012-05-31 09:36:18

标签: c modulus

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

我有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);

4 个答案:

答案 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);

hoursunsigned 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 );