私は次のことを知っています
unsigned short b=-5u;
アンダーフローのためにbが65531であると評価されますが、5uが-5に変換される前にsigned intに変換されてから、unsignedに再変換されてbに格納されるか、-5uが0に等しいかはわかりません。 -5u(これは当てはまらないはずです、-xは単項演算子です)
5u
はリテラルの符号なし整数、-5u
はその否定です。符号なし整数の否定は 2**n からの減算として定義され、ゼロからの減算の結果をラップするのと同じ結果が得られます。
5u
type を持つ右辺値式である単一のトークンunsigned int
です。単項演算子は、符号なし算術 (2^n を法とする算術演算、 nは符号なし型のビット数)-
の規則に従って適用されます。結果は に変換されます。それらが適合しない場合 (および適合しない場合)、モジュロ算術も使用して変換が行われます (モジュロ 2^n、nは対象の型のビット数)。unsigned short
sizeof(int) > sizeof(short)
元の引数が type のunsigned
short
場合、実際の手順は異なることに注意してください (ただし、結果は常に同じになります)。したがって、次のように記述したとします。
unsigned short k = 5;
unsigned short b = -k;
最初の操作は short のサイズによって異なります。short が int よりも小さい場合 (多くの場合、常にそうとは限りません)、最初のステップ
k
はint
. ( short と int のサイズが同じ場合、最初のステップは にプロモートするk
ことです。それ以降、すべてが上記のように行われます。)符号付き整数演算の規則に従って、unsigned int
単項-
が this に適用されます (したがって、 int
-5 の値になります)。unsigned short
結果の -5 は、上記のモジュロ演算を使用して暗黙的に に変換されます。
一般に、これらの違いは違いを生みませんが、 の整数値を持つ可能性がある場合は、違いが生じる可能性がありますINT_MIN
。2 の補数マシンで-i
は、i
型int
と値INT_MIN
は実装定義であり、後で符号なしに変換すると奇妙な値になる可能性があります。
技術的にはアンダーフローではなく、-5
符号なしの数値として表示された場合の符号付きの値の表現です。符号付き数値と符号なし数値の「ビット」は同じであることに注意してください。表示が異なるだけです。値を符号付きの値として出力する場合 [残りのビットを埋めるために符号ビットを使用して拡張されていると仮定]、-5 と表示されます。[これは、2 の補数を使用する典型的なマシンであると想定しています。C標準はそれを必要とせずsigned
、unsigned
タイプは同じビット数であり、コンピューターが符号付き数値を表すために2の補数を使用することもありません-明らかに、2の補数を使用していない場合、表示された値と一致しないため、あなたのこれは、x86、68K、6502、Z80、PDP-11、VAX、29K、8051、ARM、MIPS などのすべての一般的なプロセッサである 2 の補数のマシンです。ただし、技術的には、C が正しく機能する必要はありません]
また、単項演算子を使用すると、 [これはコンピューターだけでなく数学にも適用されます - 同じ結果になります] と-x
同じ効果があります。0-x