2

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

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

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

C++ での整数昇格は知っていますが、なぜそうなるのか理解できません。私が理解している方法では、式はバイナリ~uint8_t(0)で評価する必要があります。1111 1111次に、演算子は、値を に符号拡張することにより、型を an (説明のために 32 ビットであると想定します)~に昇格させます。この昇格された値は、左辺値に割り当てられる必要があり、結果は になります。 int0000 0000 0000 0000 0000 0000 1111 1111xx == 255

しかし、明らかに私はこれを正しく理解していません。私は何が欠けていますか?

4

2 に答える 2

7

整数昇格は unary のオペランドで実行される~ため、uint8_t(0)が に昇格されてからint~評価されます。と同等です

~(int)(uint8_t)0

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

uint32_t x = (uint8_t)-1;
于 2010-11-01T22:29:58.850 に答える
2

あなたの例では、ビット単位の否定演算子 ( ) は、実行前に~そのオペランドを an に昇格させています。これは代入によって にint変換されます。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

于 2010-11-01T22:35:20.340 に答える