64-Bit Arithmetic
INTERCAL-64 extends the language from 16-bit and 32-bit to full 64-bit precision. Three new types join the family:
| Prefix | Name | Width |
|---|---|---|
. | spot | 16-bit |
: | two-spot | 32-bit |
:: | double cateye | 64-bit |
, | tail | 16-bit array |
; | hybrid | 32-bit array |
;; | double hybrid | 64-bit array |
Constants scale to match:
| Prefix | Name | Width |
|---|---|---|
# | mesh | 16-bit |
## | fence | 32-bit |
#### | stockade | 64-bit |
The absence of a triple mesh (###) is intentional. Three meshes would imply 48-bit precision, which is not a thing.
128-Bit Ephemeral Mingle
Mingle two 64-bit values and you get a 128-bit result. It can't be stored — it exists only long enough to be consumed by a select operator. The value is briefly real and then gone, much like a good idea in a committee meeting.
DO ::1 <- ####1000000
DO ::2 <- ####2000000
DO ::3 <- '::1 $ ::2' ~ '####FFFFFFFF $ ####FFFFFFFF'
Complete System Library
The system library (syslib64.i) provides arithmetic at every width. All routines are implemented in pure INTERCAL. No cheating.
16-Bit
| Label | Operation |
|---|---|
(1000) | .3 = .1 + .2 |
(1010) | .3 = .1 - .2 |
(1040) | :3 = .1 * .2 (full 32-bit result) |
(1030) | .3 = .1 / .2, .4 = remainder |
32-Bit
| Label | Operation |
|---|---|
(1500) | :3 = :1 + :2 |
(1510) | :3 = :1 - :2 |
(1540) | :3 = :1 * :2 |
DIVIDE32 | :3 = :1 / :2, :4 = remainder |
64-Bit
| Name | Operation |
|---|---|
ADD64 | ::3 = ::1 + ::2 |
MINUS64 | ::3 = ::1 - ::2 |
TIMES64 | ::3 = ::1 * ::2 |
Plus AND64, OR64, XOR64, NOT64, RANDOM16/32/64, and POPCOUNT. Routine labels are computed by interpreting the name as a big-endian 64-bit integer. The programmer who finds this inconvenient is reminded that convenience has never been a design goal.
64-Bit Labels
Labels have been extended to 64 bits. Programs exceeding 119 lines are now assured of having enough. All new library routines use labels with values greater than INT_MAX to avoid collisions. Users are encouraged to prefer labels like (744073709551615) over (10).
Component Architecture
INTERCAL-64 compiles to .NET assemblies. Libraries can be compiled separately and linked via -r:library.dll. Cross-component NEXT/RESUME/FORGET is fully supported. You can even call INTERCAL from C# — though no evidence of anyone doing this voluntarily has been found.