正負整数の掛け算


1.正負整数掛け算プログラム1 直感的なプログラム


   符号を取り払った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
*/


2. 正負整数掛け算プログラム2 こんなふうでもできます。

正負数掛け算の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
*/


3. 正負整数掛け算プログラム3 実はこれでできてしまう。

正負数掛け算の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
*/