【程序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, 真值不变
}