だから私は試験のために改訂しています、そして私はこの問題で立ち往生しました:
2.67◆◆intが32ビットのマシンで実行すると1を生成し、それ以外の場合は0を生成するプロシージャint_size_is_32()を作成するタスクが与えられます。sizeof演算子を使用することは許可されていません。これが最初の試みです:
1 /* The following code does not run properly on some machines */
2 int bad_int_size_is_32() {
3 /* Set most significant bit (msb) of 32-bit machine */
4 int set_msb = 1 << 31;
5 /* Shift past msb of 32-bit word */
6 int beyond_msb = 1 << 32;
7
8 /* set_msb is nonzero when word size >= 32
9 beyond_msb is zero when word size <= 32 */
10 return set_msb && !beyond_msb;
11 }
ただし、32ビットSUNSPARCでコンパイルして実行すると、このプロシージャは0を返します。次のコンパイラメッセージは、問題を示しています。警告:左シフトカウント>=タイプの幅
A.コードはどのようにしてC標準に準拠していませんか?
B.データ型intが少なくとも32ビットであるすべてのマシンで正しく実行されるようにコードを変更します。
C.データ型intが16ビット以上のマシンで正しく実行されるようにコードを変更します。
__ _ __ _ ____私の答え:
A:4行目で31シフトすると、オーバーフローします。符号なし整数標準に従って、表現できる符号なし整数の最大値は2^31-1です。
B:4行目1 << 30
C:4行目1<<14および6行目1<<16
私は正しいですか?そうでなければ、なぜお願いしますか?ありがとうございました!
__ _ __ _ ____ 2番目の暫定的な回答:
B:4行目(1 << 31)>> 1および6行目:int beyond_msb = set_msb + 1; 今回は正しいかもしれないと思います:)