Page 1 of 1

Choose integer size

Posted: 31 Dec 2017, 16:40
by buttshark
It would be nice to be able to choose and stick with the size of an integer for a variable, because ahk automatically changing them can make them difficult to work with when doing bitwise operations. Simple example and current workaround:

Code: Select all

msgbox, % ~~-1 ;-1 is 0xFFFFFFFFFFFFFFFF. ~ that is 0x00000000. ~ that is 0xFFFFFFFF
;workaround:
;	x := -1
;	is64Bit := x < 0 OR x > 0xFFFFFFFF
;	y := ~~x
;	if(is64Bit AND y >= 0 AND y <= 0xFFFFFFFF)
;	{
;		y |= 0x7FFFFFFF00000000
;		y := y << 1 >> 1 ;the negative bit is special for some reason
;	}
;	msgbox, % y
Thanks :)

Re: Choose integer size

Posted: 31 Dec 2017, 17:37
by lexikos
As far as I am aware, the ~ operator is the only special case; all other operators are purely 64-bit.

You can just do n ^ -1 instead of ~n.

Also, see commit 247bf90f (v2-alpha).
y := y << 1 >> 1 ;the negative bit is special for some reason
This is standard arithmetic shift.
Instead of being filled with all 0s, as in logical shift, when shifting to the right, the leftmost bit (usually the sign bit in signed integer representations) is replicated to fill in all the vacant positions (this is a kind of sign extension).
Source: Arithmetic shift - Wikipedia

Re: Choose integer size

Posted: 31 Dec 2017, 18:03
by buttshark
lexikos wrote:Also, see commit 247bf90f (v2-alpha).
Okay, cool. So is this for just future AutoHotkey_L?

lexikos wrote:
y := y << 1 >> 1 ;the negative bit is special for some reason
This is standard arithmetic shift.
Ah, I see. I was wondering about the bit shift in my other post, too. But still,

Code: Select all

y |= 0xFFFFFFFF00000000
replacing

Code: Select all

y |= 0x7FFFFFFF00000000
y := y << 1 >> 1
doesn't work, and I'm not sure why

Re: Choose integer size

Posted: 01 Jan 2018, 04:13
by lexikos
So is this for just future AutoHotkey_L?
Sorry, what? It's for v2 only. Scripts rely on the current behaviour.
y |= 0xFFFFFFFF00000000
That's because
Commands, functions, and expressions that accept numeric inputs generally support 15 digits of precision for floating point values. For integers, 64-bit signed values are supported, which range from -9223372036854775808 (-0x8000000000000000) to 9223372036854775807 (0x7FFFFFFFFFFFFFFF). Any integer constants outside this range are not supported and might yield inconsistent results. By contrast, arithmetic operations on integers wrap around upon overflow (e.g. 0x7FFFFFFFFFFFFFFF + 1 = -0x8000000000000000).
Source: Variables and Expressions

Re: Choose integer size

Posted: 01 Jan 2018, 07:01
by nnnik
It would be nice to have up to 0xFFFF FFFF FFFF FFFF though for the use of binaries ( and convert it internally to -1 in thise case )