| 
              #include <stdio.h>
 //#define SHOW
 
 #pragma warning(disable:4996)
 
 void binout(char *s, char v)
 {
 char i;
 printf("%s", s);
 for (i = 0; i < 8; i++)
 {
 if (v & 0x80)
 putchar('1');
 else
 putchar('0');
 if (i == 0)
 putchar('.');
 v <<= 1;
 }
 }
 
 short multiply(char x, char y)
 {
 // 所有寄存器全部采用算术移位
 // 且都采用双符号位
 char a = 0;
 char b2 = ~x + 1;
 char c = y;
 char cn = 0;
 char i;
 for (i = 1; i <= 8; i++) // 7位数值位需要8步操作
 {
 if ((c & 1) == 0 && cn == 1)
 a += x;
 else if ((c & 1) == 1 && cn == 0)
 a += b2;
 
 if (i != 8)
 {
 cn = c & 1; // c的最低位移入cn
 c >>= 1;
 
 // a的最低位移入c的最高位
 if (a & 1)
 c |= 0x80;
 else
 c &= 0x7f;
 a >>= 1;
 }
 
 #ifdef SHOW
 binout("a=", a);
 binout(" c=", c);
 putchar('\n');
 #endif
 }
 return (short)((a << 7) + ((c >> 1) & 0x7f));
 }
 
 void test(char a, char b)
 {
 printf("%d * %d = %d\n", a, b, multiply(a, b));
 }
 
 void check(void)
 {
 char a, b;
 short c;
 int cnt = 0;
 FILE *fp = fopen("result.txt", "w");
 if (fp == NULL)
 return;
 for (a = -64; a <= 63; a++)
 {
 for (b = -64; b <= 63; b++)
 {
 c = multiply((char)a, (char)b);
 if (a * b != c)
 {
 fprintf(fp, "Warning: %d * %d != %d\n", a, b, c);
 cnt++;
 }
 else
 fprintf(fp, "%d * %d = %d\n", a, b, c);
 }
 }
 fclose(fp);
 printf("Warning count: %d\n", cnt);
 }
 
 int main(void)
 {
 check();
 test(-5, -3);
 test(-9, -16);
 test(-32, 1);
 test(-13, -11);
 return 0;
 }
 
 |