Bash использует переменные intmax_t
для арифметики. В вашей системе они имеют длину 64 бита, поэтому:
$ echo $((1<<62))
4611686018427387904
- это
100000000000000000000000000000000000000000000000000000000000000
в двоичном формате (1, за которой следуют 62 0). Снова сдвиньте:
$ echo $((1<<63))
-9223372036854775808
что равно
1000000000000000000000000000000000000000000000000000000000000000
в двоичном формате (63 0), в арифметике с двумя дополнениями.
Чтобы получить самое большое представимое целое число, нужно вычесть 1:
$ echo $(((1<<63)-1))
9223372036854775807
что в двоичном исчислении равно
111111111111111111111111111111111111111111111111111111111111111
-.
Как указано в ilkkachu в ответе, на 64-битных x86 процессорах (будь то RCL
или SHL
) сдвиг происходит по модулю 64, что объясняет наблюдаемое вами поведение:
$ echo $((1<<64))
1
эквивалентно $((1. Таким образом,
$((1 - это
$((1,
$((1 - это
$((1...
Определения типов и максимальные значения вы найдете в stdint.h
; в вашей системе:
/* Largest integral types. */
#if __WORDSIZE == 64
typedef long int intmax_t;
typedef unsigned long int uintmax_t;
#else
__extension__
typedef long long int intmax_t;
__extension__
typedef unsigned long long int uintmax_t;
#endif
/* Minimum for largest signed integral type. */
# define INTMAX_MIN (-__INT64_C(9223372036854775807)-1)
/* Maximum for largest signed integral type. */
# define INTMAX_MAX (__INT64_C(9223372036854775807))
В Debian повторное создание ключей хоста может произойти с помощью:
rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server