sjbarag / brs

An interpreter for the BrightScript language that runs on non-Roku platforms.
MIT License
113 stars 43 forks source link

Roku handles hexadecimal as signed integer #285

Open lvcabral opened 5 years ago

lvcabral commented 5 years ago

This code:

color = &HC0C0C0FF
print color

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

sjbarag commented 5 years ago

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.

lvcabral commented 5 years ago

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