【程序1】
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
// 顯示八位二進制數的字元串(C語言編寫)
const char *getcode(char a)
{
static char str[9];
char i;
for (i = 0; i < 8; i++)
{
if (a & 0x80)
str[i] = '1';
else
str[i] = '0';
a <<= 1;
}
str[8] = '\0';
return str;
}
// 補碼不恢復餘數除法(C語言編寫)
// 11.000000~00.111111 (-64~63)
char div(char a, char b, char *r)
{
char c = 0;
char i;
for (i = 0; i < 6; i++) // 尾數有6位, 所以只需要做6步, 不需要像原碼除法那樣額外添加恢復餘數的步驟
{
printf("2r%d=%s ", i, getcode(a << 1));
if (((a ^ b) & 0x80) == 0)
{
c |= 1; // 同號商1
a = (a << 1) + ~b + 1; // A左移後加-B
}
else
a = (a << 1) + b; // 商0, A左移後加+B
printf("c=%s\n", getcode(c));
c <<= 1; // 左移後最低位為0
printf("r%d=%s\n", i + 1, getcode(a));
}
*r = a; // 餘數通過參數3返回
// 對商校正, 對於採用雙符號位的C, 第一符號位始終為0, 第二符號位為求得的假商符
// 正的假商符00加上11後是真商符11
// 負的假商符01加上11後是真商符00(捨去進位)
// 所以應該加上11.000001=0xc1
// for循環的最後一步的最後, c左移了, 在這裡將最低位恆置1
c += 0xc1;
return c; // 返回帶雙符號位的真商
}
// 算式輸出(C++語言編寫)
// 為了簡化代碼, 輸出部分用C++編寫
void output(char a, char b, char c, char r)
{
string str = getcode(a);
str += " / ";
str += getcode(b);
str += " = ";
string s2 = getcode(c);
s2.insert(2, ".");
str += s2;
str += "……";
s2 = getcode(r);
s2.insert(2, ".");
str += s2;
cout << endl << "二進制算式: " << str << endl;
cout << "十進制算式:" << (int)a << " / " << (int)b << " = " << (int)c << "/64……" << (int)r << "/64" << endl;
cout << "驗算: " << (int)c << "/64 * " << (int)b << " + " << (int)r << "/64 = " << (int)a << endl;
if (c * b + r == 64 * a) // 把/64從等式左邊移到右邊變成*64, 避免計算機本身的浮點運算問題影響判斷
cout << "計算結果正確" << endl;
else
cout << "計算結果有誤" << endl;
}
int main(void)
{
char a = 32;
char b = -40;
char c, r;
printf("被除數a=%s\n", getcode(a)); // 小數點位於末尾
printf("除數b=%s\n", getcode(b));
c = div(a, b, &r);
// 以下三句代碼是用C++編寫的
printf("商c=%s\n", string(getcode(c)).insert(2, ".").c_str()); // 第二符號位後就是小數點
printf("餘數r=%s\n", string(getcode(r)).insert(2, ".").c_str());
output(a, b, c, r);
return 0;
// 注意: 負數開頭添1, 真值不變
}