テスト限界:

テスト限界:

これは探求的な質問です。つまり、この質問が何についてのものか完全にはわかりませんが、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(使用するかどうかにかかわらずRCLSHLは、次のように表示される動作を説明します。

$ 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))

おすすめ記事