首页 文章

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

提问于
浏览
2

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

我有 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 回答

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

    应该

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

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

    有些事情我没有必要进行双重划分,然后将结果分配回 unsigned char ,你可能只做整数除法 .

  • 2

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

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

    hoursunsigned char 在表达式 hours*3600 中被提升为 int .

    如果您正在使用16位 int ,则上述行会遇到问题 . 在二进制补码系统中,16位 int 范围从 -32768 变为 32767 ,这意味着当 hours>= 10 时,您有溢出 .

  • 0

    首先,您使用 double 进行计算,因为您使用的是 double 常量 .

    然后模数计算将不会作为 unsigned char 完成,因为它是一种窄类型 . 通常它会首先被提升为 int ,然后计算将完成 .

    通常,最好直接使用 unsigned int 来表示所有变量 . char 类型仅在您想要节省空间时才有用 .

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

相关问题