web-dev-qa-db-ja.com

UINT_MAXではすべてのビットが1に設定されていますか?

この質問は以前に尋ねられましたが、私はまだ混乱しています。

そんなこと知ってる

unsigned int a = -1;

だろう UINT_MAX。しかし、それは-1のすべてのビットが設定されているからではありません。 C11言う

新しい型が符号なしの場合、値は、新しい型の範囲内になるまで、新しい型で表すことができる最大値よりも1だけ多く加算または減算することによって変換されます。

だからUINT_MAXは100です(2 ^ 16-1よりも大きいはずですが、今は無視します)

unsigned int a = -1; // will be
unsigned int a = -1 + UINT_MAX + 1; // 100 = UINT_MAX  

標準はUINT_MAX >= 2^16-1。しかし、それはどこでも2 ^ n-1であるべきだと言っていますか?

また、C++では答えが異なりますか?

32
user1097048

Cでは、符号なし整数の最大値は次の形式でなければなりません。1:2[〜#〜] n [〜#〜] -1。

したがって、値UINT_MAXのすべてのビットは1に設定されます。値が指定されていないパディングビットが存在する場合があります。


1 (引用元:ISO/IEC 9899:201x 6.2.6.2整数型1)
unsigned char以外のunsigned integer型の場合、オブジェクト表現のビットは、値ビットとパディングビットの2つのグループに分けられます(後者は必要ありません)。 [〜#〜] n [〜#〜]値ビットがある場合、各ビットは1と2の間の2の異なる累乗を表す[〜#〜] n [〜#〜] − 1 、そのタイプのオブジェクトは0から2までの値を表すことができるようにする[〜#〜] n [〜#〜]-1純粋なバイナリ表現を使用。これは値表現と呼ばれます。パディングビットの値は指定されていません。

46
2501

いいえ、違います。

符号なしの型は値ビットおよびパディングビットで構成できます。

値ビットは常に最大値の1に設定されますが、パディングビットの特定の値は実装に任されていることは正しいです。つまり、これはUINT_MAXがMersenne数である必要があることを意味します。その他の要件では、65535未満にすることはできません。

CとC++はこの点で同等です。

12
Bathsheba

変換の定義により、unsigned intに変換された-1はUINT_MAXであることが保証されていると言って間違いありません。ビットパターンとは何の関係もありません。 UINT_MAXが100である実装がある場合、-1をunsigned intに変換すると100になります。

UINT_MAXを100にできない理由はいくつかあります。1つは2 ^ 16-1以上でなければならないためですが、UINT_MAX = 1,000,000が許容されます。 2番目に、unsigned intは値ビットの固定数nのバイナリ表現を持つ必要があるため、UINT_MAX = 2 ^ n-1です。

is INT_MAX = 2 ^ 31-1およびUINT_MAX = 2 ^ 31-1(通常は2 ^ 32-1ではない)である可能性があります。その場合、-1では32ビットが設定されます。 -1をunsigned intにキャストすると、2 ^ 31-1になり、31ビットしか設定されません。

2
gnasher729