符号を取り払った2数をかけて,符号を後から調整する。
PC上で動作するので,intは4byte,short intは2byteである。
正負数掛け算のCプログラム(PCで動作する) |
#include "stdio.h" int main() { int r00,r10; int sign=0; //積の符号 0:+ 1:- short int r0,r1,r2; //r2=r0*r1を作る scanf("%d %d",&r00,&r10); //掛け算部本体+++ここから+++ r0=r00; r1=r10; if (r0<0) { //r0<0の時に符号を覚えて,r0を符号反転 sign=1; r0=-r0; } if (r1<0) { //r0<0の時に符号を覚えて,r1を符号反転 sign=1-sign; r1=-r1; } r2=0; do { if(r1&1) r2+=r0; r0<<=1; r1>>=1; } while (r1); if (sign) r2=-r2; //覚えていた符号によって,必要ならr2の符号反転 //掛け算部本体+++ここまで+++ printf("r0,r1,r2= %04x, %04x, %04x\n",(unsigned short)r00,(unsigned short)r10,(unsigned short)r2); printf("r0,r1,r2=%6d,%6d,%6d\n",r00,r10,r2); } /* 85 10 r0,r1,r2= 0055, 000a, 0352 r0,r1,r2= 85, 10, 850 85 -10 r0,r1,r2= 0055, fff6, fcae r0,r1,r2= 85, -10, -850 -85 10 r0,r1,r2= ffab, 000a, fcae r0,r1,r2= -85, 10, -850 -85 -10 r0,r1,r2= ffab, fff6, 0352 r0,r1,r2= -85, -10, 850 */ |
正負数掛け算のCプログラム(PCで動作する) |
#include "stdio.h" int main() { int r00,r10; short int r0,r1,r2; //r2=r0*r1を作る scanf("%d %d",&r00,&r10); //掛け算部本体+++ここから+++ r0=r00; r1=r10; r2=0; do { if(r1&1) r2+=r0; r0<<=1; r1>>=1; r1&=0x7fff; } while (r1); //掛け算部本体+++ここまで+++ printf("r0,r1,r2= %04x, %04x, %04x\n",(unsigned short)r00,(unsigned short)r10,(unsigned short)r2); printf("r0,r1,r2=%6d,%6d,%6d\n",r00,r10,r2); } /*実行結果 85 10 r0,r1,r2= 0055, 000a, 0352 r0,r1,r2= 85, 10, 850 85 -10 r0,r1,r2= 0055, fff6, fcae r0,r1,r2= 85, -10, -850 -85 10 r0,r1,r2= ffab, 000a, fcae r0,r1,r2= -85, 10, -850 -85 -10 r0,r1,r2= ffab, fff6, 0352 r0,r1,r2= -85, -10, 850 */ |
正負数掛け算のCプログラム(PCで動作する) |
#include "stdio.h" int main() { int r00,r10; unsigned short int r0,r1,r2; //r2=r0*r1を作る scanf("%d %d",&r00,&r10); //掛け算部本体+++ここから+++ r0=r00; r1=r10; r2=0; do { if(r1&1) r2+=r0; r0<<=1; r1>>=1; } while (r1); //掛け算部本体+++ここまで+++ printf("r0,r1,r2= %04x, %04x, %04x\n",(unsigned short)r00,(unsigned short)r10,(unsigned short)r2); printf("r0,r1,r2=%6d,%6d,%6d\n",r00,r10,(signed short)r2); } /* 85 10 r0,r1,r2= 0055, 000a, 0352 r0,r1,r2= 85, 10, 850 85 -10 r0,r1,r2= 0055, fff6, fcae r0,r1,r2= 85, -10, -850 -85 10 r0,r1,r2= ffab, 000a, fcae r0,r1,r2= -85, 10, -850 -85 -10 r0,r1,r2= ffab, fff6, 0352 r0,r1,r2= -85, -10, 850 */ |