计算系统基础的实验报告 实验1 数的机器表示

计算机系统基础:实验1 数的机器表示

提示:根据《计算机系统基础》 中给出的解释来解决更容易,首先是能够手算二进制和十进制转换,明白其原理,很简单

题目要求:

  1. 能够用C语言模拟机器底层表示无符号整数
  2. 能够用C语言模拟机器底层表示有符号整数
  3. 能够用C语言模拟机器底层表示浮点数

#include <stdio.h>
#include <stdlib.h>
unsigned int unsignedToValue(char binary[],int n);
int intToValue(char binary[],int n);
float floatToValue(char binary[]);

int main(int argc, char *argv[]) {
    char binary[33];
    gets(binary);
//    printf("无符号数%u \n",unsignedToValue(binary,32));
//    printf("有符号数%d \n",intToValue(binary,32));
    printf("浮点数为:%f\n",floatToValue(binary));
    return 0;
}
unsigned int unsignedToValue(char binary[],int n){
    unsigned int sum = 0;
    int i;
    for(i = 0;i<n;i++){
    if(binary[i] == '1'){
        sum = sum + (1<<(n-i-1));
    }
}
return sum;
}
int intToValue(char binary[],int n){
    int sum = 0;
    int i;
    for(i = 0;i<n;i++){
    if(binary[i] == '1'){
        sum = sum + (1<<(n-i-1));
    }
}
return sum;
}
float floatToValue(char binary[]){
        float sum = 0;
        int exponent = 0;
        int symbol = 1;
        float significand = 0;
        if(binary[0]=='1') {
            symbol = -1;//符号位
        }
        for(int i = 1; i < 9; i++) {
            if(binary[i]=='1') {
                exponent = exponent + (1<<(8-i));
            }
        }
        exponent = exponent - 127;//所得阶码减去偏移量
        if(exponent>=0) {
            significand = 1<<exponent;
            for(int i = 9; i < 32; i++) {
                if(binary[i]=='1') {
                    //此处计算小数点前的位数
                    if(exponent > i-9){
                        significand = significand + (1<<(exponent-(i-8)));
                    }else{
                    //此处计算小数点后的位数
                        significand = significand + (1.0/(1<<(i-exponent-8)));
                    }
                }
            }
            sum = significand * symbol;
        } else {
            for(int i = 9; i < 32; i++) {
                if(binary[i]=='1') {
                    significand = significand + (1.0/(1<<(exponent+i-8)));
                }
                sum = significand * symbol;
            }
        }
        if((exponent==128)&&(significand==0)) {
            printf("无穷大\n");
            return (1.0/0.0);//表示无穷
        }
        if((exponent==128)&&(significand!=0)) {
            printf("不是一个数字\n");
            return (0.0/0.0);//不是一个数字
        }
        if((exponent==-127)&&(significand!=0)) {
            printf("非规格化数\n");
            return 0;
        }
        return sum;
}

无符号数和有符号数的经过测试,是OK的!
但是计算有符号数的可有其他方法,比如记录符号位之类的方法

浮点数的举例:

浮点数的例子

总结:

秘诀:书上自有黄金屋!
都是基本的进制转换,对于int类型的数的无符号有符号的表示,还有浮点数的表示,本人才疏学浅,可能浮点数的表示问题中,若阶码计算为负数,可能出现一些错误,也可能不出现,主要是不曾再尝试其他的情况的例子,若出现错误,敬请指正!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值