これは探求的な質問です。つまり、この質問が何についてのものか完全にはわかりませんが、Bashの最大整数に関連していると思います。とにかく明確に定義します。
$ echo $((1<<8))
256
少し動いて整数を生成します。どのくらい離れて行けますか?
$ echo $((1<<80000))
1
明らかに、私たちはまだこの点に達していません。 (1は予期せぬことでした。もう一度説明します。) しかし、
$ echo $((1<<1022))
4611686018427387904
それでも肯定的です。しかしこれはない:
$ echo $((1<<1023))
-9223372036854775808
そしてさらに、
$ echo $((1<<1024))
1
なぜ1ですか?なぜ次のような状況が発生しますか?
$ echo $((1<<1025))
2
$ echo $((1<<1026))
4
このシリーズを分析したい人はいますか?
修正する
マイコンピュータ:
$ uname -a
Linux tomas-Latitude-E4200 4.4.0-47-generic #68-Ubuntu SMP Wed Oct 26 19:39:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
ベストアンサー1
吹く変数を使用したintmax_t
算術演算の実行。お使いのシステムでは、長さは64ビットなので、次のようになります。
$ echo $((1<<62))
4611686018427387904
これは
100000000000000000000000000000000000000000000000000000000000000
バイナリ形式(1の後に62個のゼロがオーム)。戻る:
$ echo $((1<<63))
-9223372036854775808
これは
1000000000000000000000000000000000000000000000000000000000000000
2進数(0 63個)、2の補数算術。
表現可能な最大の整数を得るには、1 を減算します。
$ echo $(((1<<63)-1))
9223372036854775807
これは
111111111111111111111111111111111111111111111111111111111111111
バイナリの形で。
指摘したとおりイルカチョ~の回答、オフセットモジュロ64を使用して64ビットに移動x86CPU(使用するかどうかにかかわらずRCL
)SHL
は、次のように表示される動作を説明します。
$ echo $((1<<64))
1
と同じです$((1<<0))
。$((1<<1025))
$((1<<1))
$((1<<1026))
$((1<<2))
タイプ定義と最大値は以下で確認できます。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))