|
|
View previous topic :: View next topic |
Author |
Message |
hmmpic
Joined: 09 Mar 2010 Posts: 314 Location: Denmark
|
subtraction signed int8 |
Posted: Tue Oct 21, 2014 1:14 pm |
|
|
This is only a test program.
I have tested it in MPLAB V8.92. with the simulator.
It is compiled in CCS 5.027! and tested in real hardware (not the posted code)
Only the first OK1 is working all the other fail! But why?
I am Confused.
Code: | #include <18F26k22.h>
#use delay(clock=8M,int)
#use RS232(Baud=57600,STOP=1,PARITY=N,BITS=8,UART1,ERRORS,stream=sim900)
/*Max dif: ad-adtmp=+-5 adtmp-ad=+-5*/
void GetTemp2(){
int8 ok=0;
int8 ad,adtmp;
int8 cnt;
ad=127;
adtmp=127;
for (cnt=0; cnt<10; cnt++){
ad++; /* Test with ad--, ad++, adtmp--, adtmp++ */
printf("AD:%u ADTmp:%u Cnt:%u\r\n",ad,adtmp,cnt);
ok=0;
if ( (((signed int8)ad-adtmp)<5) && (((signed int8)ad-adtmp)>-5) ) {ok=1;}
printf("OK1:%u\r\n",ok);
ok=0;
if ( ((-adtmp+ad)<5) && ((-adtmp+ad)>-5) ) {ok=1;}
printf("OK2:%u\r\n",ok);
ok=0;
if ( ((ad+(-adtmp))<5) && ((ad+(-adtmp))>-5) ) {ok=1;}
printf("OK3:%u\r\n",ok);
ok=0;
if ( ((ad+(-adtmp))<5) && ((adtmp+(-ad))<5) ) {ok=1;}
printf("OK4:%u\r\n",ok);
printf("******\r\n");
}
}
void main() {
GetTemp2();
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Tue Oct 21, 2014 1:23 pm |
|
|
A signed int8, can hold values from -128 to +127.
An unsigned int8, uses the same storage to hold 0 to 255.
You start at 127.
Then increment - now have 128. When this is converted to a signed int8, you get -1.
Then increment again - now have 129. When this is converted to a signed int8, you have -2.
etc. etc.
You are overflowing the signed int8 arithmetic, just about everywhere.... |
|
|
hmmpic
Joined: 09 Mar 2010 Posts: 314 Location: Denmark
|
|
Posted: Tue Oct 21, 2014 2:06 pm |
|
|
Now I ended up with this working on:
Code: | if (ad>adtmp) { ok=(ad-adtmp)<5; } else { ok=(adtmp-ad)<5; } |
Thanks for hints on the overflow:-) |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|