3

C99 (ISO/IEC 9899:1999)

6.2.6.2/1 整数型

パディング ビットの値は指定されていません。45)符号ビットがゼロである符号付き整数型の有効な (非トラップ) オブジェクト表現は、対応する符号なし型の有効なオブジェクト表現であり、同じ値を表すものとします。

任意の整数型の場合、すべてのビットがゼロであるオブジェクト表現は、その型の値ゼロの表現でなければなりません。

C99 標準では、すべてのビットがゼロである整数型は0、それぞれの型の値を表すことが保証されています。しかし、これは基になるバイナリ値が期待どおりであることを保証しますか?

例えば:

unsigned x = 42;

通常、マシンはこの 10 進42数値を 2 進数値としてメモリに格納すると予想され101010ます。

しかし、一部の風変わりなマシン アーキテクチャで42は、2 進数値と同じ 10 進数値を格納011011できますか?

その場合は、右シフト操作を利用する次のコードを検討してください。

unsigned y = x>>1;    /* 101010>>1 or 011011>>1 */

y10 進値21(10101バイナリ) または 10 進値13(バイナリ) を保持しますか01101?

C99 標準は、ビット演算後の符号なし整数型の 10 進数表現について保証していますか? たとえば、右シフトは、2すべてのマシン アーキテクチャで整数除算と同等であることが保証されていますか?

4

3 に答える 3

3

整数の表現は、標準では指定されていません。
ただし、 と の動作は>><<ビットの位置ではなく、ビットの意味に従って定義されます。
したがって>> 1、これらのビットが実際にどこにあるかに関係なく、4 を表すビットを 2 を表すビットに移動します。

C99 標準セクション 6.5.7の引用:

E1 >> E2の結果は、E1右シフトしたE2ビット位置です。E1が unsigned 型の場合、またはE1signed 型で負でない値の場合、結果の値はE1 / 2 E2の商の整数部になります。E1に符号付きの型と負の値がある場合、結果の値は実装定義です。

于 2013-06-11T13:49:05.687 に答える
1

標準は、物がメモリに物理的に格納される方法について何も保証しません。その必要はありません。マシンは、バイナリではなく、物理レベルで 3 進、10 進、またはアナログにすることができます。マシンは、物理ビットを持つ必要さえありません。

unsigned int について保証しているのは、ビットごとの演算子が数値のバイナリ位置表現の要素として「ビット」に影響を与えることだけです。これらは実際には仮想ビットです。それらは物理ビットに直接対応することも (実際には通常そうであるように)、純粋に概念的なものにすることもできます。

演算子は、>>これらの仮想ビットを右にシフトすることが保証されています。つまり、正の整数値を 2 で除算することが常に保証されx = 42x = x >> 121ますx。つまり、物理的に として表さ42れるマシンがある場合、そのマシンのコンパイラは、その表現を(それが何であれ)の表現011011に変更するコードを生成する必要があります。パターン。4221011011

于 2013-06-11T14:40:29.210 に答える
1

オペレーターは>>ビットを移動します。通常のシステムでは、それは単にそれらをシフトすることを意味します。しかし実際には、 position を表すビットを取り、それがどこにあっても2^3position に移動します。2^2

したがって、すべてのシステムで、assert(42 >> 1 == 21).


2番目の質問については、トラップ/パディングビットを無視する限り、はい。それらは明らかに異なる場合がありますが、一般的には見えません。

于 2013-06-11T13:39:09.630 に答える