より小さな整数の最大値をより大きな整数に割り当てる
-
28-09-2019 - |
質問
次のコードを検討してください。
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
所属していません StackOverflow