计算机系统基础实验 - 数的机器级表示

实验1 数的机器级表示

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

一、实验目的

1.熟练掌握无符号整数的机器级表示
2.熟练掌握有符号整数的机器级表示
3.熟练掌握浮点数的机器级表示

二、实验要求

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

三、实验设备、环境

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

四、实验步骤及内容

用C语言编写程序模拟32位机器数到真值的转换,在main中定义
char binary[33];
1.编写无符号数的转换:

unsigned int unsignedToValue(char binary[],int n);

要求在main中从屏幕读入32个二进制数即0或者是1,调用unsignedToValue函数返回此二进制数代表的无符号数的真值。
2.编写有符号数的转换:

int intToValue(char binary[],int n);

要求在main中从屏幕读入32个二进制数即0或者是1,调用intToValue函数返回此二进制数代表的有符号数的真值。
3.编写单精度浮点数的转换:

float floatToValue(char binary[],int n);

要求在main中从屏幕读入32个二进制数即0或者是1,调用intToValue函数返回此二进制数代表的浮点数的真值,要求能够输出非规格化数:无穷大,0,非数。

提示:

  1. 在测试时,连续输入32个0、1,不要在中间加入空格或者换行符
  2. 可以尝试将字符型的0和1转换成整型的0和1,方便判断和计算
  3. 注意有符号整数为正数的时候计算方式同无符号整数,因此可以通过调用无符号整数函数来简化代码
  4. 注意到计算阶实际上就是计算无符号整数
  5. 计算浮点数的时候应该先判定是否为非规格化数,如果判定成功就可以直接输出结果。

五、讨论、思考题

1、IEEE754标准的浮点数好处在哪里?

1.尾数可表示的位数多了一位,因而使浮点数的精度更高;
2.阶码的可表示范围更大,因而使浮点数范围更大。

代码

#include<stdio.h>

void removeBlank(char *str) {
    
    
    char *tmp = str;
    int i, j = 0;
    for (i = 0; str[i] != '\0'; i++) {
    
    
        if (str[i] != ' ')
            tmp[j++] = str[i];
    }
    tmp[j] = '\0';
    str = tmp;
}

unsigned int unsignedToValue(char binary[],int n) {
    
    
    unsigned int res = 0;
    for(int i = 0; i < n; i++) {
    
    
        res = res + ((binary[i] - '0') << (n - 1 - i));
    }
    return res;
}

int intToValue(char binary[],int n) {
    
    
    char tmp[32] = {
    
    '0'}; 
    if(binary[0]=='1') {
    
    
        for(int i = 1; i < n; i++) {
    
    
            tmp[i] = binary[i]^1;
        }
        if(tmp[n-1] == '1'){
    
     
            for (int i = 30; i > -1 ; i --) {
    
    
                tmp[i] ^= 1;
                if(tmp[i] == '1') break;
            }
        }
        tmp[n-1] ^= 1;
        return -(int)unsignedToValue(tmp,n);;
    } else {
    
    
        return (int)unsignedToValue(binary,n);
    }
}

float floatToValue(char binary[],int n) {
    
    
    int E;
    float res = 0,M = 0;
    int sign = (binary[0] == '1') ? -1 : 1;
    E = (int) unsignedToValue(binary+1,8) - 127;
    if(E >= 0) {
    
    
        for(int i = 9; i < 32; i++) {
    
    
            M = M + ((binary[i]-'0')<<(E))/(float)(1<<(i-8));
        }
        res = (M + (1<<E)) * sign;
    }
    else {
    
    
        for(int i = 9; i < 32; i++) {
    
    
            M = M + ((binary[i]-'0')*1.0/(float)(1<<(-E)))/((float)(1<<(i-8)));
        }
        res = (M + (1/(1<<(-E)))) * sign;
    }
    if((E==128)&&(M==0)) {
    
    
        return (1.0/0.0);
    }
    if((E==128)&&(M!=0)) {
    
    
        return (0.0/0.0);
    }
    if((E==-127)&&(M!=0)) {
    
    
        printf("denorms\n");
        return 0;
    }
    return res;
}

int main(){
    
    
    char binary[39];
    gets(binary);
    removeBlank(binary);
    printf("无符号整数:%u\n", unsignedToValue(binary,32));
    printf("带符号整数:%d\n", intToValue(binary,32));
    printf("浮点数:%f\n", floatToValue(binary,32));
    return 0;
}

测试

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

猜你喜欢

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