diff --git a/math-notes.txt b/math-notes.txt new file mode 100644 index 0000000..18d4949 --- /dev/null +++ b/math-notes.txt @@ -0,0 +1,100 @@ +Some questions and answers about doing math in UXN +-------------------------------------------------- + +Q: How can I handle negative integers in UXN? + +A: Uxn doesn't have any built-in support for signed integers. However, you can +emulate signed numbers using unsigned numbers by treating some of the values +as having different (negative) values from their unsigned values. + +For example, treating unsigned bytes as signed results in the following: + +unsigned unsigned signed + hex decimal decimal + #00 0 0 + #01 1 1 + #02 2 2 + ... ... ... + #7e 126 126 + #7f 127 127 + #80 128 -128 + #81 129 -127 + #82 130 -126 + ... ... ... + #fd 253 -3 + #fe 254 -2 + #ff 255 -1 + +The first 128 integers (0-127) are represented the same as unsigned and signed, +but the latter 128 are different. The basic idea here is that for values +greater than #7f (127) we subtract 256 to get their "signed value": + + signed(n) = if n > 127 then n else n - 256 + +It turns out that many unsigned operations "work" even when treating the values +as signed. (In other words, you get the same result as you would have using a +language with signed integer types.) The following arithmetic instructions work +correctly with "signed" values: + + EQU and NEQ + ADD (example: `#13 #ff ADD` returns #12) + SUB (exampel: `#02 #03 SUB` returns #ff) + MUL (example: `#02 #ff MUL` returns #fe) + +Other instructions will not handle "negative" integers correctly: + + GTH and LTH: + + 1. these work correctly when comparing values with the same sign + (example: `#80 #ff LTH` returns #01) + + 2. however, LTH will consider negative values greater than non-negative + values, which is incorrect. + (example: `#ff #00 GTH` returns #01, but -1 is less than 0) + + These implementations will safely compare "signed" bytes: + + @signed-lth ( x^ y^ -- x