试图让一些代码工作,模数不想做我想做的事......这意味着我错了 .
我有 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);
4 回答
应该
除此之外,它适用于足够小的输入:http://ideone.com/VPKP1
有些事情我没有必要进行双重划分,然后将结果分配回
unsigned char
,你可能只做整数除法 .你提到它是一个嵌入式程序 .
hours
是unsigned char
在表达式hours*3600
中被提升为int
.如果您正在使用16位
int
,则上述行会遇到问题 . 在二进制补码系统中,16位int
范围从-32768
变为32767
,这意味着当hours
为>= 10
时,您有溢出 .首先,您使用
double
进行计算,因为您使用的是double
常量 .然后模数计算将不会作为
unsigned char
完成,因为它是一种窄类型 . 通常它会首先被提升为int
,然后计算将完成 .通常,最好直接使用
unsigned int
来表示所有变量 .char
类型仅在您想要节省空间时才有用 .你的程序写的很糟糕,尝试这样做,它运行正常