Skip to content

Commit 5c751db

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

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

Documentation/int64_max.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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+
```sh
10+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %d\n" "$0" $(( 1 << 62 ))'; done
11+
OUT: zsh: 4611686018427387904
12+
OUT: dash: 4611686018427387904
13+
OUT: bash: 4611686018427387904
14+
OUT: ksh: 4611686018427387904
15+
OUT: lksh: 4611686018427387904
16+
OUT: ash: 4611686018427387904
17+
18+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %s\n" "$0" $(( 1 << 63 ))'; done
19+
OUT: zsh: -9223372036854775808
20+
OUT: dash: -9223372036854775808
21+
OUT: bash: -9223372036854775808
22+
OUT: ksh: -9223372036854775808
23+
OUT: lksh: -9223372036854775808
24+
OUT: ash: -9223372036854775808
25+
26+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 1 << 63 ))'; done
27+
zsh:1: number truncated after 18 digits: 9223372036854775808
28+
OUT: zsh: f333333333333334
29+
OUT: dash: 8000000000000000
30+
OUT: bash: 8000000000000000
31+
OUT: ksh: 8000000000000000
32+
OUT: lksh: 8000000000000000
33+
OUT: ash: 8000000000000000
34+
```
35+
36+
```sh
37+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %s\n" "$0" $(( 0x7fffffffffffffff + 1 ))'; done
38+
OUT: zsh: -9223372036854775808
39+
OUT: dash: -9223372036854775808
40+
OUT: bash: -9223372036854775808
41+
OUT: ksh: -9223372036854775808
42+
OUT: lksh: -9223372036854775808
43+
OUT: ash: -9223372036854775808
44+
45+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 1 ))'; done
46+
zsh:1: number truncated after 18 digits: 9223372036854775808
47+
OUT: zsh: f333333333333334
48+
OUT: dash: 8000000000000000
49+
OUT: bash: 8000000000000000
50+
OUT: ksh: 8000000000000000
51+
OUT: lksh: 8000000000000000
52+
OUT: ash: 8000000000000000
53+
54+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 2 ))'; done
55+
OUT: zsh: 8000000000000001
56+
OUT: dash: 8000000000000001
57+
OUT: bash: 8000000000000001
58+
OUT: ksh: 8000000000000001
59+
OUT: lksh: 8000000000000001
60+
OUT: ash: 8000000000000001
61+
62+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 3 ))'; done
63+
OUT: zsh: 8000000000000002
64+
OUT: dash: 8000000000000002
65+
OUT: bash: 8000000000000002
66+
OUT: ksh: 8000000000000002
67+
OUT: lksh: 8000000000000002
68+
OUT: ash: 8000000000000002
69+
70+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0x7fffffffffffffff + 0x7fffffffffffffff + 1 ))'; done
71+
OUT: zsh: ffffffffffffffff
72+
OUT: dash: ffffffffffffffff
73+
OUT: bash: ffffffffffffffff
74+
OUT: ksh: ffffffffffffffff
75+
OUT: lksh: ffffffffffffffff
76+
OUT: ash: ffffffffffffffff
77+
```
78+
79+
There are anomalies in parsing large numbers:
80+
81+
```sh
82+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %x\n" "$0" $(( 0xffffffffffffffff ))'; done
83+
zsh:1: number truncated after 15 digits: ffffffffffffffff
84+
OUT: zsh: fffffffffffffff
85+
OUT: dash: 7fffffffffffffff
86+
OUT: bash: ffffffffffffffff
87+
OUT: ksh: ffffffffffffffff
88+
OUT: lksh: ffffffffffffffff
89+
OUT: ash: ffffffffffffffff
90+
91+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %s\n" "$0" $(( 0x8000000000000000 ))'; done
92+
zsh:1: number truncated after 15 digits: 8000000000000000
93+
OUT: zsh: 576460752303423488
94+
OUT: dash: 9223372036854775807
95+
OUT: bash: -9223372036854775808
96+
OUT: ksh: -9223372036854775808
97+
OUT: lksh: -9223372036854775808
98+
OUT: ash: -9223372036854775808
99+
100+
$ for sh in zsh dash bash ksh lksh "busybox ash"; do $sh -c 'printf "OUT: %4s: %d\n" "$0" $(( -9223372036854775808 ))'; done
101+
zsh:1: number truncated after 18 digits: 9223372036854775808
102+
OUT: zsh: -922337203685477580
103+
OUT: dash: -9223372036854775807
104+
OUT: bash: -9223372036854775808
105+
OUT: ksh: -9223372036854775808
106+
OUT: lksh: -9223372036854775808
107+
OUT: ash: -9223372036854775808
108+
```

0 commit comments

Comments
 (0)