Skip to content

Commit c4769b4

Browse files
committed
Add doc about max int64_t values
Signed-off-by: Alexey Gladkov <legion@kernel.org>
1 parent 32ccfa5 commit c4769b4

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

Documentation/int64_max.md

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# Maximum Int64 Number
2+
3+
Many shell implementations support 64-bit numbers, but there is a problem with
4+
parsing their maximum values. Some shell implementations handle this
5+
differently.
6+
7+
It is notable that the behavior differs between dash and ash from busybox.
8+
9+
## Agenda
10+
11+
* zsh - zsh (5.9) - UNIX Shell similar to the Korn shell (https://www.zsh.org/)
12+
* dash - dash (0.5.12) - Debian Almquist Shell (https://git.kernel.org/pub/scm/utils/dash/dash.git)
13+
* bash - bash (5.3_p3) - GNU Bourne-Again Shell (https://git.savannah.gnu.org/cgit/bash.git)
14+
* ksh - loksh (7.7) - Linux port of OpenBSD's ksh (https://github.com/dimkr/loksh/)
15+
* lksh - mksh (59c) - MirBSD Korn Shell (https://mbsd.evolvis.org/mksh.htm)
16+
* ash - busybox (1.36.1) - Tiny utilities for small and embedded systems (https://busybox.net/)
17+
18+
## Results
19+
20+
```sh
21+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %d\n" "$0" $(( 1 << 62 ))'; done
22+
OUT: zsh: 4611686018427387904
23+
OUT: dash: 4611686018427387904
24+
OUT: bash: 4611686018427387904
25+
OUT: ksh: 4611686018427387904
26+
OUT: lksh: 4611686018427387904
27+
OUT: ash: 4611686018427387904
28+
29+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %s\n" "$0" $(( 1 << 63 ))'; done
30+
OUT: zsh: -9223372036854775808
31+
OUT: dash: -9223372036854775808
32+
OUT: bash: -9223372036854775808
33+
OUT: ksh: -9223372036854775808
34+
OUT: lksh: -9223372036854775808
35+
OUT: ash: -9223372036854775808
36+
37+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 1 << 63 ))'; done
38+
zsh:1: number truncated after 18 digits: 9223372036854775808
39+
OUT: zsh: f333333333333334
40+
OUT: dash: 8000000000000000
41+
OUT: bash: 8000000000000000
42+
OUT: ksh: 8000000000000000
43+
OUT: lksh: 8000000000000000
44+
OUT: ash: 8000000000000000
45+
```
46+
47+
```sh
48+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %s\n" "$0" $(( 0x7fffffffffffffff + 1 ))'; done
49+
OUT: zsh: -9223372036854775808
50+
OUT: dash: -9223372036854775808
51+
OUT: bash: -9223372036854775808
52+
OUT: ksh: -9223372036854775808
53+
OUT: lksh: -9223372036854775808
54+
OUT: ash: -9223372036854775808
55+
56+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 1 ))'; done
57+
zsh:1: number truncated after 18 digits: 9223372036854775808
58+
OUT: zsh: f333333333333334
59+
OUT: dash: 8000000000000000
60+
OUT: bash: 8000000000000000
61+
OUT: ksh: 8000000000000000
62+
OUT: lksh: 8000000000000000
63+
OUT: ash: 8000000000000000
64+
65+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 2 ))'; done
66+
OUT: zsh: 8000000000000001
67+
OUT: dash: 8000000000000001
68+
OUT: bash: 8000000000000001
69+
OUT: ksh: 8000000000000001
70+
OUT: lksh: 8000000000000001
71+
OUT: ash: 8000000000000001
72+
73+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 3 ))'; done
74+
OUT: zsh: 8000000000000002
75+
OUT: dash: 8000000000000002
76+
OUT: bash: 8000000000000002
77+
OUT: ksh: 8000000000000002
78+
OUT: lksh: 8000000000000002
79+
OUT: ash: 8000000000000002
80+
81+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 0x7fffffffffffffff + 1 ))'; done
82+
OUT: zsh: ffffffffffffffff
83+
OUT: dash: ffffffffffffffff
84+
OUT: bash: ffffffffffffffff
85+
OUT: ksh: ffffffffffffffff
86+
OUT: lksh: ffffffffffffffff
87+
OUT: ash: ffffffffffffffff
88+
```
89+
90+
There are anomalies in parsing large numbers:
91+
92+
```sh
93+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0xffffffffffffffff ))'; done
94+
zsh:1: number truncated after 15 digits: ffffffffffffffff
95+
OUT: zsh: fffffffffffffff
96+
OUT: dash: 7fffffffffffffff
97+
OUT: bash: ffffffffffffffff
98+
OUT: ksh: ffffffffffffffff
99+
OUT: lksh: ffffffffffffffff
100+
OUT: ash: ffffffffffffffff
101+
102+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %s\n" "$0" $(( 0x8000000000000000 ))'; done
103+
zsh:1: number truncated after 15 digits: 8000000000000000
104+
OUT: zsh: 576460752303423488
105+
OUT: dash: 9223372036854775807
106+
OUT: bash: -9223372036854775808
107+
OUT: ksh: -9223372036854775808
108+
OUT: lksh: -9223372036854775808
109+
OUT: ash: -9223372036854775808
110+
111+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %d\n" "$0" $(( -9223372036854775808 ))'; done
112+
zsh:1: number truncated after 18 digits: 9223372036854775808
113+
OUT: zsh: -922337203685477580
114+
OUT: dash: -9223372036854775807
115+
OUT: bash: -9223372036854775808
116+
OUT: ksh: -9223372036854775808
117+
OUT: lksh: -9223372036854775808
118+
OUT: ash: -9223372036854775808
119+
```

0 commit comments

Comments
 (0)