【C++】十进制整数转二进制 十进制浮点数转IE754格式二进制

十进制整数转二进制

输入整数以补码形式显示

例如:
input: 10
outout: 1010

正整数的补码为其原码,负数的补码为其模减去该负数的绝对值(模运算)

例如:
input: -9
outout: s(1)1110111 //其中s(1)为符号位

二进制整数转换器

十进制浮点数转IE754格式二进制

IE754格式二进制
在这里插入图片描述
S 符号位:
    1 表示negative负数 ; 0表示 positive正数
Exponent(阶码):
    规格化阶码范围为0000 0001 (-126) ~ 1111 1110 (127)
    阶码使用移码表示,移码为偏置常数+指数值,bias(偏置常数)为127 (single单精度), 1023 (double双精度)
Significand(尾数部分):
    规格化尾数最高位总是1(小数点前),所以隐含表示,省1位,转换时需要加上隐含的1

例如:
input: 1.5
outout: 0 01111111 110000000000000000000000
input: -1.5
outout: 1 01111111 110000000000000000000000

IE754二进制浮点数转换器

代码如下:

#include<iostream>
//引入STL栈,用于转二进制时存放除余结果
#include <stack>
//引入STL字符串,用于存放二进制结果(数值类型可能溢出)
#include <string>
//用于数值转换字符串
#include <sstream>
//浮点小数部分乘2取整floor方法
#include <math.h>
using namespace std;
//十进制整数转换二进制字符串
string getReal(int num){
	if (num<0)
	{
		num=128+num;
	}
	stack<int> st;
	while (num>0)
	{
		st.push(num%2);	
		num=num>>1;
		if (num<2 && num!=0)
		{
			st.push(num);
			num=num>>1;
		}
	

	}
	int n=st.size();
	string sum="";
	stringstream s;
	for (int i=0;i<n;i++)
	{
		s<<st.top();
		sum+=s.str();
		s.str("");
		st.pop();
		
	}
	return sum;
	
}
//十进制浮点转换IE754二进制
string getFloat(double num){
	string result;
	if (num>0)
	{
		result="0 ";
	}else{
		result="1 ";
		num=-num;
	}
	int Real=(int)num;
	double decimals=num-Real;
	
	string real=getReal(Real);
	//Step Code
	string StepCode=getReal(real.size()+127-1)+" ";//IE754格式化尾数隐含位1,故需指数-1
	if (StepCode.size()<=8)
	{
		StepCode="0"+StepCode;
	}
	//组合符号和阶码
	result+=StepCode;
	//运算小数部分
	string dec="";
	double n=0;
	stringstream s2;
	for(int i=0;i<24-real.size();i++)
	{
		int k;
		n = decimals * 2;
		k =floor(n);
		s2<<k;
		dec += s2.str();
		s2.str("");
		decimals = n - k;
	}
	real+=dec;
	result+=real;
	return result;

}
int main(){
	
	double num=0;
	cout<<"请输入一个数: ";
	cin>>num;
	int Real=(int)(num>0?num:-num);
	if ((num>0?num:-num)-Real>0)
	{
		cout<<"输入为浮点数,以IE754表示为:";
		cout<<"10->2:"<<getFloat(num)<<endl;

	}else{
		
		cout<<"输入为整数,以补码(模128)形式表示:";
		cout<<"10->2: "<<(num>0?"":"s(1)")<<getReal(num)<<endl;
	}

	return 0;
}


  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

列队猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值