リトルエンディアンとビッグエンディアンに関するビットごとの否定演算子(Cでは〜)
-
10-07-2019 - |
質問
これは宿題に関連していますが、これは宿題ではありません。
ビット単位ではない(Cの〜
)が signed int
と unsigned int
ビッグエンディアンマシンとリトルエンディアンマシンでコンパイルした場合。
バイトは本当に " backwards&quot ;;そして、もしそうであれば、ビット単位のNOT(および他の演算子)は、マシンタイプに応じて異なる結果の int
を生成しますか?
その間、Cのビット演算子ごとに答えは同じですか、それとも大きく依存していますか?
参照している演算子は次のとおりです。
~ /* bitwise Not */
& /* bitwise And */
| /* bitwise Or */
^ /* bitwise Exclusive-Or */
事前に感謝します!
更新:これまでの応答を読んで、ビット単位のnot演算子が signed int
の符号ビットに影響を与えるかどうかを尋ねざるを得ないと感じています。静けさを忘れてしまったので、この部分で少し混乱していたのではないかと心配しています。 Adamは、すべての値が符号なしとして扱われると述べているようです。符号ビットは再適用されますか、または一度署名された値は符号なしになりますか?
解決
ビット演算子と論理演算子はすべて、ビッグエンディアンとリトルエンディアンのマシンで同じように動作します。同様に、署名されたデータと署名されていないデータに対しても同じように演算子を使用します。結果はすべてが署名されていないかのようになります。したがって、 x
と y
が符号付き整数の場合、〜x
は(int)(〜((unsigned int)x)と等しくなります
および x& y
は、(int)(((unsigned int)x)&((unsigned int)y)
などに等しい他の演算子の。
他のヒント
@Adamの答えが示すように、これらの演算子はビット単位で行われるため、バイトの順序は実際には重要ではありません!たとえば、バイト単位のxの長さに関係なく、 signed
整数 x
ごとに(〜x)==(-x-1)
、そしてマシンのエンディアンに関係なく(2の補数演算を使用している限り-残っていないものはありますか?)
論理演算子は、引数がゼロかどうかだけを気にし、これらの値が実際にメモリでどのように表されるかを気にしません。したがって、論理演算では、エンディアンは重要ではありません。
ビットごとの演算子は常に引数のすべてのビットに作用し、異なるビット位置に個別に影響します(結果のビット#5は入力のビット#5に依存します)。彼らはビットが保存される順序を気にしません、またはビットの一部がデータ型にとって特別な意味を持っているかもしれない場合、それらはすべてそれらを処理します。したがって、ここではエンディアンネスも重要ではありません。なぜなら、それらの順序に関係なく、すべてのビットが影響を受けるだけだからです。