上に戻る
資料3.-1と255は等しい?
 8ビット整数を考えます。
 以下で、マイナスの表現は、1の補数表現(?)って奴で考えます。
 よって、 -1=FFh  -2=FEh  ……  -128=80h
 さて、8ビット整数値
 FF
 があったとして、これは10進数でいくつでしょう?
 これは、この整数値が符号付と見るか、符号無しとみるかで答えが変わります。
 符号付と見たときは、『-1』です。
 符号無と見たときは、『255』です。
 ビット内容が同じなのに、2つの表現方法があって問題が起きないのでしょうか。
 例えば、足し算することを考えます。
 40hに、FFhを足してみます。
 まず、符号付と見たとき。40h=64dであるので、
 64+(-1)=63=3Fh
 続いて、符合無しと見たとき。このときは、計算結果がFFhを超えてしまいます。越えた部分は切り捨て、下位8ビットのみ見るとすると、
 64+255=319=256+63=63(mod256)=3Fh
 結局同じ値になりました。こんな感じで、どっちに見るかで演算結果が変わることはないようです。

 と、書くと、C言語で、signedとunsignedのシフト結果は違うだろ!という事になりますが……
 恐らく、それは、ある変数をsignedと見ているかunsignedと見ているかによって、コンパイラが割り当てるCPUの命令が異なるからではないかと思います。知らんけど^^
 あるいは、CPUのモードを切り替えるとか?
 ※参考 C言語→pentium互換(?)機械語
;int sed=23;
;unsigned int used=23;
;sed >>= 2 ;
8b 45 dc  mov eax, DWORD PTR _sed$[ebp]
c1 f8 02  sar eax, 2                 ←
89 45 dc  mov DWORD PTR _sed$[ebp], eax
;used >>= 2 ;
8b 4d e0  mov ecx, DWORD PTR _used$[ebp]
c1 e9 02  shr ecx, 2                 ←
89 4d e0  mov DWORD PTR _used$[ebp], ecx
 ←の2箇所で命令が違う
(23)2007年2月17日 プレさ兵衛
inserted by FC2 system