2016-09-19 11 views
1

は、我々は次のコードがあるとします。ビット単位の操作は移植可能ですか?

int j = -1 & 0xFF; 

jでの結果の値は、基礎となる表現に基づいて、次のいずれかになります。

System   Value 
Two's complement 0xFF 
One's complement 0xFE 
Sign/Magnitude  0x01 

しかし&|、および^演算子ですCでは常に2の補数の形で定義されます(したがって、jは常に0xFFと等しくなります)か、またはそれらはシステムの基礎となる表現に関して定義されていますか?

+0

一般的なアドバイスとして、符号付き整数を使用することは、bit-opsとビットシフトの左側のオペランドでは避けるべきです(右のオペランドは問題を引き起こすほどにはなりません)。 – Olaf

答えて

2

実際のビット表現で定義されています。 C11 final draftからバイナリ&オペレータの

結果ビット単位のANDオペランドの(つまり、結果内の各ビットは、変換後のオペランドの対応するビットのそれぞれが設定されている場合だけ設定されています)。
...
^演算子の結果は、オペランドのビットごとの排他的論理和です(つまり、変換されたオペランドの対応するビットのうちの1つが設定されている場合のみ、結果の各ビットが設定されます)。
...
結果|演算子は、オペランドのビットごとの包括ORです(つまり、変換されたオペランドの対応するビットの少なくとも1つが設定されている場合にのみ、結果の各ビットが設定されます)。

+0

量子プロセッサでさえ、そのレジスタに従わなければなりませんか?もちろんキュビットのすべての次元について? –

+0

したがって、負でないビット演算だけが移植可能でなければならない。 – owacoder

+0

@huseyintugrulbuyukisik:古典的なプログラミング言語で量子プロセッサをプログラミングすることは意味がありません。しかし、あなたがこの規格に準拠していると言いたいのであれば、それはもちろんです。これは** **標準の背後にある基本的なアイデアです。もちろん、ISO4032に準拠したねじを呼び出すことは、特定の特性をも意味します。 – Olaf

関連する問題