質問

次のコードを検討してください。

 uint32_t x = ~uint8_t(0);
 std::cout << x << std::endl;

今、私はこれが出力することを完全に期待していました 255, 、その代わりに出力されます 4294967295.

C ++での整数プロモーションを知っていますが、なぜこれが起こるのか理解できません。私がそれを理解する方法、表現 ~uint8_t(0) に評価する必要があります 1111 1111 バイナリで。 ~ その後、オペレーターはタイプをに昇進させます int (これは議論のために32ビットだと思います)、値をに拡張するサインによって 0000 0000 0000 0000 0000 0000 1111 1111. 。この促進された値は、lvalueに割り当てる必要があります x, 、 その結果 x == 255.

しかし、明らかに私はこれを正しく理解していません。何が足りないの?

役に立ちましたか?

解決

統合プロモーションは、ユニリーのオペランドで実行されます ~, 、だから uint8_t(0) に昇進します int そして、 ~ 評価されます。それは同等です

~(int)(uint8_t)0

使用するタイプで表現可能な最大値を取得できます std::numeric_limits<T>::max();タイプが署名されていない場合は、キャストすることもできます -1 そのタイプへ:

uint32_t x = (uint8_t)-1;

他のヒント

あなたの例では、Bitise Not Operator(~)オペランドをanに宣伝しています int 実行する前。これは、anに変換されます unsigned int 割り当てによって。

これをより明確にする関連するコードサンプルを次に示します。

uint8_t y = ~uint8_t(0);
uint32_t x = y;
std::cout << x << std::endl;

255

uint8_t y = uint8_t(0);
int z = ~y;
uint32_t x = z;
std::cout << x << std::endl;

4294967295

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top