crypto icon indicating copy to clipboard operation
crypto copied to clipboard

Roku handles hexadecimal as signed integer

Open lvcabral opened this issue 6 years ago • 2 comments

This code:

color = &HC0C0C0FF
print color

Shows in Roku console as: -1061109505 Shows in brs console as: 3233857791

lvcabral avatar Aug 10 '19 18:08 lvcabral

Interesting! I'm curious if that's just a representation quirk in the reference implementation (in which it's actually an unsigned value internally and just prints as a negative signed value) or if it's stored internally as a signed value.

sjbarag avatar Aug 15 '19 16:08 sjbarag

Quote by RokuKC from the forum (link below)

here are some somewhat subtle issues with respect to specifying integer constants and how type conversions and limit checks are performed.

Hex constants can represent a full 32-bit unsigned range of integers (0 .. &hFFFFFFFF - 4,294,967,295), as overlaid on a 32-bit signed integer variable. Values outside that range get clipped to 32-bits.

Integer constants should represent a full 32-bit signed range, but the current behavior is to only represent integer -999,999,999 .. 999,999,999. Values outside that range get implicitly promoted to type Double.

However, if you pass that Double value to an integer-typed parameter, or assign it to an integer-typed variable, it goes through a narrowing conversion back to signed integer. The value is out of range and in this case happens to be converted to an out of range value &h80000000, which happens to look like a reddish color value.

https://forums.roku.com/viewtopic.php?f=34&t=84652

lvcabral avatar Sep 03 '19 18:09 lvcabral