Page 1 of 1

problem with negative long numbers

Posted: Tue Dec 23, 2008 11:07 pm
by harkon
looking at the following;

Code: Select all

;Why does a negative number return 8 bytes

LongValue.l=2147483647
Debug "As a long " + Str(LongValue) + " .. as hex " + Hex(LongValue)
Debug ""

LongValue=-2147483647
Debug "As a long " + Str(LongValue) + " .. as hex " + Hex(LongValue)
Debug "Shoud return FFFFFFFF .. right?"

Why does this now return a different Hex() string than it did in PB Version 4.2? I can allow for this in that if the number is negative I can just discard the first 4 bytes, but will this behavior remain, or is it something that needs fixing?

TIA, and thanks to the team for all of their efforts on 4.3.

Posted: Tue Dec 23, 2008 11:13 pm
by Kaeru Gaman
I think maybe because Debug casts a Quad on it?
the first Value is also Quad, but leading Zeros are not printed?

> "Shoud return FFFFFFFF .. right?"
nope. $FFFFFFFF is -1

Posted: Tue Dec 23, 2008 11:28 pm
by freak
Use #PB_Long as the second parameter to Hex() to treat it as a long value (returning FFFFFFFF in this case)

Posted: Tue Dec 23, 2008 11:31 pm
by Kaeru Gaman

Code: Select all

LongValue = -2147483648
Debug "As a long " + Str(LongValue) + " .. as hex " + Hex(LongValue, #PB_Long)

LongValue = -1
Debug "As a long " + Str(LongValue) + " .. as hex " + Hex(LongValue, #PB_Long)

a.l = $FFFFFFFF
Debug Str(a)

Posted: Wed Dec 24, 2008 4:53 am
by Little John
freak wrote:Use #PB_Long as the second parameter to Hex() to treat it as a long value (returning FFFFFFFF in this case)
Oh, this information is another Christmas present. ;-)
In the (English and German) help for PB 4.30, it's not mentioned that Hex() can take a second parameter.

Code: Select all

Debug Hex(-1)
Debug Hex(-1, #PB_Quad)
Debug Hex(-1, #PB_Long)
Debug Hex(-1, #PB_Word)
Debug Hex(-1, #PB_Byte)
Regards, Little John

Posted: Wed Dec 24, 2008 3:47 pm
by harkon
Thanks everyone. As mentioned the help didn't say anything about this so I was clueless. #PB_Long does the trick. And, you're right it should have returned 8000001, had a brain fart there. Never was too great at base conversion :oops:

BTW I've found a few oversights in the help, like a some of the new libraries help points to an example but there doesn't seem to be an example available. I know that help authoring is a huge undertaking, so I'm very grateful for the help given.

Thanks to all for your help, got this one ported to PB 4.3 and works great. On to the next :D

Posted: Wed Dec 24, 2008 6:55 pm
by mk-soft
since pb v4.3 is $FFFFFFFF not equal -1 because is casts as quad

Code: Select all

Procedure.l LONG(Value.q)
  ProcedureReturn Value
EndProcedure

Procedure.b BYTE(Value.q)
  ProcedureReturn Value
EndProcedure

#c_test1 = $FFFFFFFF ; <- casts as quad
#c_test2 = -1

If #c_test1 = #c_test2
  Debug "Equal"
Else
  Debug "Error"
EndIf

If LONG(#c_test1) = #c_test2
  Debug "Equal"
Else
  Debug "Error"
EndIf

If BYTE(#c_test1) = BYTE(#c_test2)
  Debug "Equal"
Else
  Debug "Error"
EndIf

Posted: Wed Dec 24, 2008 7:31 pm
by Kaeru Gaman
debug also before had casted quads...

run this is 4.2:

Code: Select all

Debug $FFFFFFFF
and also in 4.3, a long is treated as long:

Code: Select all

a.l = $FFFFFFFF
Debug a
so, your sentence
since pb v4.3 is $FFFFFFFF not equal -1 because is casts as quad
is missing at least two parameters to be evaluated as True or False...