计算机系统基础实验 - 定点数加减法的机器级表示

实验序号:2 实验名称:定点数加减法的机器级表示
适用专业:软件工程 学 时 数:2学时

一、实验目的

1、掌握定点数加法的机器级表示。
2、掌握定点数减法的机器级表示。
3、掌握EFLAGS中4个牵涉到计算的标志位的计算方法。
4、掌握计算溢出的判定方法。

二、实验要求

按照实验题目的要求,编写程序并上机调试

三、实验设备、环境

计算机、Windows 7 、Visual C++ 6.0

四、实验步骤及内容

用C语言编写二进制数运算模拟程序

1.编写整数加减法器:
设在main中有如下数组:

char int1[5];
char int2[5];

编写函数

int addsub(char int1[],char int2[],int flag,int m,int n);

当flag为0时表示加法运算,当flag为1时表示减法运算,做4位的加减法运算,返回4位结果。m和n分别是int1和int2的大小。在函数中必须要计算OF,CF,SF,ZF,并输出4个值,根据值输出是否产生了溢出,是哪一种溢出。

提示:
1.要注意到减法运算本质仍然是做加法,只不过要将减数取补码而已。
2.注意OF和CF并不只是判定最高位是否有进位
3.注意判定是否溢出必须要知道数是有符号还是无符号才行,加法器本身没有能力判定这一点。

五、讨论、思考题

1、为什么要用补码来表示整数?
2、机器底层是如何判定溢出的?
3、为什么编译器一定要知道数据的类型才能够做计算?

#include <stdio.h>

int addsub(char int1[], char int2[], int flag, int m, int n);

int main()
{
    
    
    char input[10];
    scanf("%s", input);
    char int1[5];
    char int2[5];
    for (int i = 0; i < 4; i++)
    {
    
    
        int1[i] = input[i] - '0';
        int2[i] = input[i + 5] - '0';
    }
    int flag = input[4]=='-'?1:0;
    addsub(int1, int2, flag, 4, 4);
    printf("结果:%d%d%d%d\n", int2[0], int2[1], int2[2], int2[3]);
    printf("ZF=%d,SF=%d,CF=%d,OF=%d",int1[0], int1[1], int1[2], int1[3]);
    return 0;
}

int addsub(char int1[], char int2[], int flag, int m, int n)
{
    
    
    if(flag) {
    
    
        for(int i = 0; i < 4; i++ ) int2[i] = !int2[i];
        for(int i = n - 1, carry = 1; ~i; i--) {
    
    
            int c = carry, b = int2[i];
            int2[i] = int2[i] ^ carry;
            carry = b & c;
            if(carry == 0) break;
        }
    }
    int carry[5] = {
    
    0}, res[4] = {
    
    0};
    for(int i = n - 1; ~i; i-- ) {
    
    
        int a = int1[i], b = int2[i], c = carry[i + 1];
        res[i] = a ^ b ^ c;
        carry[i] = (a & c) | (b & c) | (a & b);
    }
    int OF = 0, ZF = 0, SF = 0, CF = 0;
    CF = carry[0] ^ flag;
    SF = res[0];
    ZF = !(res[0] | res[1] | res[2] | res[3]);
    OF = carry[0] ^ carry[1];
    int1[0] = ZF, int1[1] = SF, int1[2] = CF, int1[3] = OF;
    for(int i = 0; i < 4; i++ ) int2[i] = res[i];
    return 0;
}  

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/L6666688888/article/details/128461034