在线情况
1
  • 头像
  • 级别
    • 财富1
    • 积分23
    • 经验3096
    • 文章276
    • 注册2008-05-23
    [QUOTE][B]下面引用由[U]leon1235[/U]发表的内容:[/B]

    我的数学运算是为 (3985/4095)*2.5
    答案算出来为0,好奇怪,我改成下面的样式还是不行,都是0
    long aa;
    aa= (long)3985/(long)4095*(long...[/QUOTE]


    强制转换只能是低级的转换成高级的 你不能把一个float转换成long

     把式子转化成aa=3985*25/4095/10也无济于事 因为计算机仍然式先做3985*25的  而3985*25>65535
    实际上3985*2.5/4095 完全在int型的表示范围内(小数不计) 可以这样解决
    unsigned int aa;

    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD;
    aa = (unsigned long)3985*25/4095;// 1 (结果是24)
    aa = aa/10;//2 (结果是2)
    }

    这样的结果式aa=2  楼主应该是在12位AD冈量转换用到  其实你可以在第一句扩大个1000倍

    aa = (unsigned long)3985*25*100/4095  然后把第2句aa = aa/10;//2 (结果是2)撤掉

    这样得到的aa是你实际值的1000倍  只是在显示的时候 你在把小数点加上就OK 而且还保留了4位有效数字!
    学习学习!~
    在线情况
    2
    • 头像
    • 级别
      • 财富1
      • 积分23
      • 经验3096
      • 文章276
      • 注册2008-05-23
      为什么aa = 4985 * 25;是超界的,而aa = 65535 * 3; 却是正确的?
      我也不知道!莫非是IAR编译器的bug![EM10]
      学习学习!~
      在线情况
      3
      • 头像
      • 级别
        • 财富1
        • 积分23
        • 经验3096
        • 文章276
        • 注册2008-05-23
        [QUOTE][B]下面引用由[U]hwdz[/U]发表的内容:[/B]

        经过试验,将版主的思路整理了一下,应该明白为什么了,我将思路再说清一点,就以我最后那两个计算的对比,大家就可以理解了。
        aa = 4985 * 25;得到的结果是超界的,这是因为4985只需要2个字...[/QUOTE]

        你没疑问了?可我的疑问又被你挤出来了 选项卡里设置默认无符号只有char型, 也就是说int默认的是只能是signed ; int要用无符号的只能自己声明; 你说65535*32767是最大的?可是我发现65535*32768也可以!(我没有去声明无符号)但是65535*32769就不可以了 而有符号int型的范围是-32768---+32767这个又如何解释?谢谢!
        [EM15]
        学习学习!~
        在线情况
        4
        • 头像
        • 级别
          • 财富1
          • 积分23
          • 经验3096
          • 文章276
          • 注册2008-05-23
          谢谢!受教了!
          学习学习!~
          Powered by LeadBBS 9.2 .
          Page created in 0.1870 seconds with 7 queries.