特定の整数型で表現できる2の最大の累乗を取得するには、演算子limits.h
の代わりに使用できます。sizeof
例えば:
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
int main() {
int max = INT_MAX;
int hmax = max>>1;
int mpow2 = max ^ hmax;
printf("The maximum representable integer is %d\n",max);
printf("The maximum representable power of 2 is %d\n",mpow2);
return 0;
}
正の整数の右シフトが常に定義されているため、これは常に機能するはずです。標準のCセクション6.5.7.5(ビット単位のシフト演算子)からの引用:
E1 >> E2の結果は、E1が右シフトされたE2ビット位置です。E1が符号なし型である場合
、またはE1が符号付き型で非負の値である場合、結果の値は、
E1の商を数量で割ったものの整数部であり、2の累乗はE2です。
の使用sizeof
が必須の場合は、次を使用できます。
1 << (CHAR_BIT*sizeof(param)-1)
符号なし整数型の場合:
1 << (CHAR_BIT*sizeof(param)-2)
符号付き整数型の場合。上記の行は、パディングビットのない整数型の場合にのみ機能します。これらのラインが機能することを保証する標準Cの部分は、セクション6.2.6.2にあります。特に:
unsignedchar以外のunsignedintegerタイプの場合、オブジェクト表現のビットは、値ビットとパディングビットの2つのグループに分割されます(後者のいずれかである必要はありません)。N個の値ビットがある場合、各ビットは1から2N-1までの2の異なる累乗を表すため、そのタイプのオブジェクトは、純粋なバイナリ表現を使用して0から2N-1までの値を表すことができます。これは、値表現と呼ばれます。
次の場合に最初のメソッドが機能することを保証します。
符号付き整数型の場合、オブジェクト表現のビットは、値ビット、パディングビット、および符号ビットの3つのグループに分割されます。パディングビットは必要ありません。正確に1つの符号ビットが必要です。
..。
符号ビットがゼロである符号付き整数型の有効な(非トラップ)オブジェクト表現は、対応する符号なし型の有効なオブジェクト表現であり、同じ値を表すものとします。
2行目が正しい答えを与える理由を説明します。