1

8 ビットの負の整数 (-1 から -128 までの符号付き) を指定すると、HLA の右シフトによってオーバーフローが発生し、その理由がわかりません。1 回シフトした場合、基本的には値を 2 で除算する必要があります。これは正の数には当てはまりますが、明らかに負の数には当てはまりません。なんで?たとえば、-10 を入力すると、結果は +123 になります。

       Program cpy;

       #include ("stdlib.hhf")
       #include ("hla.hhf")


     static
     i:int8;


    begin cpy;
    stdout.put("Enter value to divide by 2: ");
    stdin.geti8();
    mov(al,i);


   shr(1,i); //shift bits one position right
   if(@o)then   // if overlow
   stdout.put("overflow");
   endif;

   end cpy; 
4

1 に答える 1

2

符号付きの数値は、バイナリの 2 の補数と「左側」の符号ビットで表されます。7 ビットでコード化された 10 の 2 の補数は 1110110 であり、負の数の符号ビット値は 1 です。

-10: 1111 0110    
     ^  
     |  
   sign bit  

次に、それを右にシフトします(右にシフトすると、ゼロが左に追加されます):

-10 >> 1: 0111 1001  
          ^  
          |  
        sign bit 

符号ビットは 0 (正) で、1111011 は 10 進数で 123 です。

于 2013-05-02T11:41:09.097 に答える