计算机系统基础:实验1 数的机器表示
提示:根据《计算机系统基础》 中给出的解释来解决更容易,首先是能够手算二进制和十进制转换,明白其原理,很简单
题目要求:
- 能够用C语言模拟机器底层表示无符号整数
- 能够用C语言模拟机器底层表示有符号整数
- 能够用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类型的数的无符号有符号的表示,还有浮点数的表示,本人才疏学浅,可能浮点数的表示问题中,若阶码计算为负数,可能出现一些错误,也可能不出现,主要是不曾再尝试其他的情况的例子,若出现错误,敬请指正!