这是咱回事呀???搞不灵清呀。

[复制链接]
3013|18
 楼主| 电子尘埃 发表于 2008-3-6 14:07 | 显示全部楼层 |阅读模式
unsigned long int temp;

   temp = 0xffff + 0xffff + 0xffff + 0xffff;
为什么temp 会等于 0x0000fffc呀。这是咱搞的呀。


 楼主| 电子尘埃 发表于 2008-3-6 14:12 | 显示全部楼层

俺是用keil V7.20版的

俺是用keil V7.20版的
俺是用keil V7.20版的
俺是用keil V7.20版的
 楼主| 电子尘埃 发表于 2008-3-6 14:13 | 显示全部楼层

绝对不要怀疑的结果,我试了N次

难道是优化错误??????????????
 楼主| 电子尘埃 发表于 2008-3-6 14:15 | 显示全部楼层

把优化关掉了,还是如此

农民讲习所 发表于 2008-3-6 14:18 | 显示全部楼层

temp = 0xffffL + 0xffffL + 0xffffL + 0xffffL;

xwj 发表于 2008-3-6 14:25 | 显示全部楼层

LS正解,Keil默认常量的字长为16位,大了就字节去低16位了

所以应该加个L表示常量是32位的
 楼主| 电子尘埃 发表于 2008-3-6 14:51 | 显示全部楼层

谢谢楼上两位我心中的高人。

我实际上是变量,我当时为了找原因就用常量了。
temp = 0xffff + 0xffff + 0xffff + 0xffff;实际上是:
unsigned long int temp;
unsigned int a,b,c,d;

temp = a +b +c +d;
像这样处理方法是咱弄呢?
ayb_ice 发表于 2008-3-6 14:54 | 显示全部楼层

随便说说

LZ:
unsigned long int temp;这样定义你说到底是long还是int类型...
应该是:
unsigned long temp;
xwj 发表于 2008-3-6 14:58 | 显示全部楼层

unsigned int a,b,c,d;,不饱和才怪

只能先强制转换后再运算,这样:
temp = (unsigned long int)(a) +(unsigned long int)(b) +(unsigned long int)(c) +(unsigned long int)(d);
农民讲习所 发表于 2008-3-6 15:16 | 显示全部楼层

temp = (unsigned long)(a + b + c + d);就行。

 楼主| 电子尘埃 发表于 2008-3-6 15:19 | 显示全部楼层

temp = (unsigned long int)(a) +b +c+ d;就正常

unsigned long int temp;    //temp是32位.
 xwj 好!
a,b,c,d是加数呀,不是存放结果的地方呀.我把存放结果的地方不是放有32位的空间给它用了吗?为什么会饱和呀.
再说temp = a+b+c+d; 不是默认的低位强制转成高位的吗?

LZ:
unsigned long int temp;这样定义你说到底是long还是int类型...
应该是:
unsigned long temp; 


unsigned long temp; 跟unsigned long int temp;是一模一样的.
xwj 发表于 2008-3-6 15:28 | 显示全部楼层

看编译器和处理器来定,long long,long int都是正常写法啊

一个基本常识:
不同编译器和处理器下int的位数是不一样的哦!!!
 楼主| 电子尘埃 发表于 2008-3-6 17:21 | 显示全部楼层

xwj 农民讲习所

unsigned long int temp;    //temp是32位.

a,b,c,d是加数呀,不是存放结果的地方呀.我把存放结果的地方不是放有32位的空间给它用了吗?为什么会饱和呀.
再说temp = a+b+c+d; 不就是默认的低位强制转成高位的吗?
为什么还要强加(unsigned long).
yewuyi 发表于 2008-3-6 19:08 | 显示全部楼层

~~,请问KEIL去……

mohanwei 发表于 2008-3-6 19:17 | 显示全部楼层

养成习惯就好了,强制转换一下……

不要抱怨了,C好歹比汇编用起来方便多了,呵呵
 楼主| 电子尘埃 发表于 2008-3-6 19:30 | 显示全部楼层

哈哈,不抱怨,不抱怨。

  幸好有高手们这么热心帮我。谢谢了....
高手们再帮个忙呀。
  如何在KEIL中增加单片机型号呀?在家里新装了个较新版的KEIL,可找不着Philips 公司系列的单片机型号了。
  
yjgyiy 发表于 2008-3-7 07:57 | 显示全部楼层

在NXP下吧

在NXP下吧
hkap 发表于 2008-3-7 09:23 | 显示全部楼层

temp = a ; temp = temp+ b + c + d;

养成良好习惯好啊
daotiansi 发表于 2008-3-7 10:12 | 显示全部楼层

随便说说

看看是不是这样:
    因为a b c d都是int型数据,所以a+b+c+d的结果也是int型数据,当然也就溢出了.这时候用强制转换符改变和的数据类型才会正确.

temp = a ; 
temp = temp+ b + c + d;
这种写法也是利用的这个道理.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

442

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部