2

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

我有unsigned chars 我试图将小时/分钟/秒分开,以便我可以在 Ascii 的屏幕上显示它们。

变量secs是一个unsigned int。其他一切都是unsigned char. 我想要unsigned chars 中的结果,以免浪费内存。在嵌入式环境中工作。

有人愿意看一下代码片段并告诉我我做错了什么吗?

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

4 回答 4

2
minutes =(secs/60.0)-(hours*3600);

应该

minutes =(secs/60.0)-(hours*60);

除此之外,它适用于足够小的输入:http: //ideone.com/VPKP1

不过,有些事情我会改变。例如,进行双除法然后将结果分配回是没有意义的unsigned char,您还不如只进行整数除法。

于 2012-05-31T10:12:40.537 回答
1

你提到它是一个嵌入式程序。

seconds = secs-(hours*3600)-(minutes*60);

hours在表达式中是一个unsigned char提升到。inthours*3600

如果您使用的是 16 位int,则上述行会有问题。在二进制补码系统上,16 位int范围从-32768to 32767which 表示当 hoursis时有溢出>= 10

于 2012-05-31T10:12:20.770 回答
0

首先,您double使用double常量进行计算。

那么模数计算将不会进行,unsigned char因为它是一个窄类型。一般会先提升到int,再进行计算。

unsigned int通常,直接使用所有变量会更好。char类型仅在您想节省空间时才有用。

于 2012-05-31T09:45:06.550 回答
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 );
于 2012-05-31T10:09:56.813 回答