在线情况
13
  • 头像
  • 级别
    • 积分51
    • 经验2657
    • 文章206
    • 注册2007-03-18
    经过试验,将版主的思路整理了一下,应该明白为什么了,我将思路再说清一点,就以我最后那两个计算的对比,大家就可以理解了。
    aa = 4985 * 25;得到的结果是超界的,这是因为4985只需要2个字节空间,所以编译器默认为4985分配了两个字节也就是最小能存放开的空间用来存这个常量,接下来做乘法操作,所乘的结果却超出了存放这个常量的空间,结果就产生了溢出!注意这个空间与aa变量本身是无关的,aa是要等到4985 * 25的这个计算出来结果之后才被赋值的,而如果这时在4985上加强制类型转换,要求以long分配常量空间,就可以得到正确结果,即 aa = (long) 4985 * 25; 。后一个不需要转换,因为结果是向前边的空间存的,我想这个方向应该是跟运算符的结合性有关,所以如果是别的运算还要注意,不一定是前边的要强制类型。
    aa = 65535 * 3;得到的结果并不超界,是因为65535虽然没有超过65536,但系统默认分配两个字节时是int,而不是unsigned int,这与编译器的设置可能有关,我记得有一个选择默认是有还是无符号的选项,所以因此造成大于32767的值都会当作long处理,所以空间已经有4个字节了,当然就可以任意计算了,别说乘3,乘32767都可以。实际上,最大可以写的是65536*32767,再大就必须声明为无符号了。

    实验最终完毕,对此问题我已不会再心存疑问了。
    微控论坛特约嘉宾
    在线情况
    14
    • 头像
    • 级别
      • 财富1
      • 积分23
      • 经验3096
      • 文章276
      • 注册2008-05-23
      为什么aa = 4985 * 25;是超界的,而aa = 65535 * 3; 却是正确的?
      我也不知道!莫非是IAR编译器的bug![EM10]
      学习学习!~
      在线情况
      15
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      其实,楼上的张浩解释非常清楚了。也不是IAR的bug,而做这类运算前做规范的参与运算数值的类型。
      不给予规定运算类型的话,IAR将自动分配其类型;运算时将可能出错。
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      在线情况
      16
      • 头像
      • 级别
        • 财富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]
        学习学习!~
        在线情况
        17
        • 头像
        • 级别
          • 积分51
          • 经验2657
          • 文章206
          • 注册2007-03-18
          [QUOTE][B]下面引用由[U]bobo[/U]发表的内容:[/B]
          ... 你说65535*32767是最大的?可是我发现65535*32768也可以!...[/QUOTE]

          请细看一下,我写的是65536*32767。若是65535的话*32768当然也可以,只要不超过signed int就行了。

          关于IAR设置我看了,确实只能设置char的默认,int的大概就是默认只有signed,所以希望大家最好能在定义变量时不要省略掉unsigned这个标志。
          微控论坛特约嘉宾
          在线情况
          18
          • 头像
          • 级别
            • 财富1
            • 积分23
            • 经验3096
            • 文章276
            • 注册2008-05-23
            谢谢!受教了!
            学习学习!~
            在线情况
            19
            • 头像
            • 级别
              • 积分8
              • 经验8471
              • 文章102
              • 注册2008-04-20
              [QUOTE][B]下面引用由[U]bobo[/U]发表的内容:[/B]

               


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

               把式子转化成aa=3985*25/4095/10也无济于事 因为计算机仍然式先做3985*25的  而3...[/QUOTE]

              不過用成這樣子的形式,我到時候要實現某些演算法,代這樣的數值進去好像就沒辦法算出來
              微控网感谢您的参与
              Powered by LeadBBS 9.2 .
              Page created in 0.6240 seconds with 6 queries.