g4mba5 at gmail.com
Thu May 27 17:41:08 CEST 2021
Le 27/05/2021 à 15:58, John Anderson a écrit :
> On 5/26/2021 11:39 PM, CD wrote:
>> why Val("&FFFF") = -1
>> why Val("&FFFFFFFF") = -1
>> is it normal?
>> attached a TestVal project
> <APOLOGIES - CORRECTIONS ADDED>
> Yes, that is correct: Val() returns a numeric value evaluated as the
> -shortest- integer type. You have specified Short (2 bytes) in first
> case, and a Long Integer (4 bytes) in the second case. In both cases
> the highest order bit of the variable is 1, hence both cases evaluate to
> a value -1.
> You can also do Val("&0000FFFF") = 65535 ' The string dictates a Long
> Or Val("&0FFFF") = 65535 ' This string is considered a Long Integer also
> Or Val("&HFFFF") = -1 ' This string as a more formal designation for
> Hex (Like VB)
> Or Val("&x1111111111111111") = -1 ' Binary string tells Gambas this
> is a 2-Byte Short (similar to VB behaviour)
> Or Val("&x11111111") = 255 ' Binary string tells Gambas this is a
> Byte (Like VB) - unsigned value - I haven't tested this extensively,
> could also be considering this as Short
> The documentation here is incorrect I think - it has left out the part
> about "Short" (and maybe Byte) type evaluations being returned if
> possible - I think that's where the confusion started:
> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----
I don't see where the documentation of Val() is incorrect, it does not
talk about the difference between "&HFFFF" and "&HFFFF&", which is a VB
horror introduced in Gambas to help old VB users.
The rule is the following:
If the number starts with "&" or "&H" (hexdecimal), "&X" or "%"
(binary), and if the number -does not- ends with "&" or "U", then there
is an automatic sign extension.
This automatic sign extension is done only if the number of digits
equals a multiple of 16-bits integer (i.e. 4 or 8 digits in hexadecimal,
16 or 32 digits in binary).
So be careful with that horror!
More information about the User