【问题标题】:modulus operator with unsigned chars带无符号字符的模运算符
【发布时间】:2012-05-31 09:36:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c modulus


    【解决方案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 范围从 -3276832767,这意味着当 hours>= 10 时,您有溢出。

      【讨论】:

        【解决方案3】:

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

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

        通常你最好直接对所有变量使用unsigned intchar 类型仅在您想节省空间时才有用。

        【讨论】:

        • 它是嵌入式编程,所以我们被告知要使用字符,除非我们有充分的理由。
        【解决方案4】:

        您的程序写得不好,尝试这样做,它可以正常运行

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

        【讨论】:

        • 写得不好?永远不会猜到这一点。好在我寻求帮助。是的,您的回复确实有帮助。我意识到一个计算错误。凌晨 3 点编码从来都不是一个好主意。谢谢。
        猜你喜欢
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 2012-04-03
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多