|
发表于 2010-11-5 13:49:14
|
显示全部楼层
回复【17楼】snoopyzz
谢谢马老师指教,
lz的错误关键在于数据溢出,*10000这个步骤上,unsigned char * signed int ,结果类型仍然为 signed int
其值范围是-32768~32767,所以杯具了,
如果每一位都只是0~9的话,lz只需要把*10000改成*10000ul就可以了,
我是习惯性都加上ul,可以避免很多不小心溢出的问题,
所以,我在10l的发言的确不对,并不是*1000000这一步的问题,当常数超出整型范围时,编译器会当作是长整形的。
但都加上ul肯定不会错:)
-----------------------------------------------------------------------
为什么这样可以:
speed_now = (speed[0]-0x30)*10000L + (speed[1]-0x30)*1000 + (speed[2]-0x30)*100 + (speed[4]-0x30)*10 + (speed[5]-0x30)
↑
speed_now = (long)speed[0]-0x30)*10000 + (speed[1]-0x30)*1000 + (speed[2]-0x30)*100 + (speed[4]-0x30)*10 + (speed[5]-0x30)
↑
speed_now = (speed[0]-0x30)*(long)10000 + (speed[1]-0x30)*1000 + (speed[2]-0x30)*100 + (speed[4]-0x30)*10 + (speed[5]-0x30)
↑
这样就不行了:
speed_now = (speed[0]-0x30)*10000) + (speed[1]-0x30)*1000 + (speed[2]-0x30)*100 + (speed[4]-0x30)*10L + (speed[5]-0x30)
↑
speed_now = (long)((speed[0]-0x30)*10000) + (speed[1]-0x30)*1000 + (speed[2]-0x30)*100 + (speed[4]-0x30)*10 + (speed[5]-0x30))
↑
speed_now = (long((speed[0]-0x30)*10000)) + (speed[1]-0x30)*1000 + (speed[2]-0x30)*100 + (speed[4]-0x30)*10 + (speed[5]-0x30)
↑
突然想通了,哈哈,因为在(speed[0]-0x30)*10000)大于32767时就已经溢出了,都溢出在转型,肯定不行了!~ |
|