i ← bits ##.int u                           ⍝ Signed from unsigned integers.
u ← bits ##.uns i                           ⍝ Unsigned from signed integers.

These  little  functions  "cast"  between  signed and unsigned integers. This is
sometimes useful when dealing with native files. Note that as all of the primit-
ive  functions  used  in  the  coding are pervasive, they-just-work on arrays of
higher rank and depth.

Technical notes:

For 8-bit (type 83) integers, the functions may be simplified to:

    uns←{256|⍵}                             ⍝ unsigned from signed byte.

    int←{¯128+256|128+⍵}                    ⍝ signed from unsigned byte.

and for 16-bit short (type 163) integers, to:

    uns←{65536|⍵}                           ⍝ unsigned from 16-bit signed.

    int←{¯32768+65536|32768+⍵}              ⍝ signed from 16-bit unsigned.

Thus, in general we have:

    uns←{(2*⍺)|⍵}                           ⍝ unsigned from ⍺-bit signed.

    int←{↑⍵{(⍺|⍺⍺+⍵)-⍵}/2*⍺-0 1}            ⍝ signed from ⍺-bit unsigned.

Examples:

    8 uns ¯3 to 3                           ⍝ 8-bit unsigned.
253 254 255 0 1 2 3

    16 uns ¯3 to 3                          ⍝ 16-bit unsigned.
65533 65534 65535 0 1 2 3

    12 uns ¯3 to 3                          ⍝ 12-bit unsigned.
4093 4094 4095 0 1 2 3

    8 int 8 uns ¯3 to 3                     ⍝ 8-bit round trip.
¯3 ¯2 ¯1 0 1 2 3

    16 int 16 uns ¯3 to 3                   ⍝ 16-bit round trip.
¯3 ¯2 ¯1 0 1 2 3

    12 int 12 uns ¯3 to 3                   ⍝ 12-bit round trip.
¯3 ¯2 ¯1 0 1 2 3

    4 hex 16 uns ¯3 to 3                    ⍝ hex of uns ...
 fffd  fffe  ffff  0000  0001  0002  0003
    4 hex ¯3 to 3                           ⍝ ... same as hex of int.
 fffd  fffe  ffff  0000  0001  0002  0003

    8 uns 8 int  2 3 4⍴256-⍳24              ⍝ ok for higher rank arrays.
255 254 253 252
251 250 249 248
247 246 245 244

243 242 241 240
239 238 237 236
235 234 233 232

    8 int 8 uns ↑,∘⊂/-⍳5                    ⍝ ok for nested arrays.
┌──┬───────────────┐
│¯1│┌──┬──────────┐│
│  ││¯2│┌──┬─────┐││
│  ││  ││¯3│¯4 ¯5│││
│  ││  │└──┴─────┘││
│  │└──┴──────────┘│
└──┴───────────────┘

See also: hex

Back to: contents

Back to: Workspaces