2017-01-04 2 views
2

次のプログラムでは〜と< <の演算がすべてのプラットフォームで負の値に収束しますか?繰り返される〜と<<操作は、すべてのプラットフォームで負の値に収束しますか?

#include <iostream> 

int main() 
{ 
    int x{}; 
    for(int i{}; i < 32; ++i) { 
     x = ~x; 
     x <<= 1; 
     std::cout << x << '\n'; 
    } 
} 

左シフトが実装定義されていないためです。 intが32ビットより大きい場合は、収束しない唯一の時間だと言うのは本当ですか?

+0

「int i {}」とはどういう意味ですか?それともint x {} 'ですか?とにかく、そのデータ型のデフォルトである序数の空の初期化子リスト、vs '= 0'? –

+4

符号付き変数の左シフトは、オーバーフローした場合は未定義です。 – Barmar

+4

@DavidLively int i {}は値の初期化を意味します。 POD整数の場合、これは0に初期化されることを意味します。 – wally

答えて

0

私の評価は、左シフトが の実装が定義されていないためです。

上記の記述は間違っています。負の値の左シフトはundefined behaviorであり、初期ゼロ値のビットが反転すると負の値になります。


変数は符号なし整数であった場合、(ビットの十分がシフトしている場合)、それは、すべての対応プラットフォーム上の正の値に収束すると言うことは、公正次のようになります。

#include <iostream> 
#include <limits> 

int main() 
{ 
    unsigned short x{}; 
    for(int i{}; i < CHAR_BIT*sizeof(unsigned short); ++i) { 
     x = ~x; 
     x <<= 1; 
     std::cout << x << '\n'; 
    } 
} 

(2の補数系で):

65534 
2 
65530 
10 
65514 
42 
65450 
170 
65194 
682 
64170 
2730 
60074 
10922 
43690 
43690 
+1

1/some /ほとんどのプラットフォームでのテストは、すべてのプラットフォーム –

+0

が真であるという証拠にはなり得ません。実際の現代のプラットフォームは、通常、古代よりも算術でより一般的です。私は条件付きで今日のアーキテクチャの99%の練習の仮定に同意することができます。しかし、一般的に移植可能ではありません。 –

+0

@JacekCz良い点。プラットフォームがC++標準に準拠している場合のみ。 – wally

関連する問題