android studio如何设置输出值的小数点_C++|代码实现整数补码和浮点数(IEEE574)的二进制位输出...

我们知道,计算机的都是用二进制的开关电路实现的。整数、浮点数、字符串在计算机中的实现都有相应的编码方案,如补码、IEEE574的浮点数表示法、ASCII字符编码方案(用整数表来编码字符)。

1 补码及二进制输出

6b24a731feab4abe55f33f2bd04050de.png

负数如何用补码表示?

先表示为自然码(原码)。

将自然码的每一位取反码。

在最低位加“1”。

e5d22bc3e6a966ea6747c52369917b21.png

如4个位的补码方案可以表示的数据范围:

4462e4eb738fc5af800f3d31ab1015f4.png

补码输出二进制位的代码:

利用移位运算、与运算取最位的方法可以输出补码的每一个二进制位。

#include using namespace std;void main(){while(1){int n;cin>>n;//最好有边界检查int h=1;h=h<<31;//32位,最高位1,其它位是0for(int i=1;i<=32;i++){if((n&h)==0)cout<<0;else cout<<1;n=n<<1; //左移一位,右位补0if(i%4==0)cout<

2 浮点数的IEEE574表示法

现代计算机中,一般都以IEEE 754标准存储浮点数,这个标准的在内存中存储的形式为:

对于不同长度的浮点数,阶码与小数位分配的数量不一样,如对于32位的单精度浮点数,数符分配是1位,阶码分配了8位,尾数分配了是23位:

a04bcbaa4802c84696a973f3ea12af22.png

符号位:0表示正;1表示负;

偏移阶码e:e=指数的实际值+127。

如有一个浮点数10110010.001,则指数是7,阶码就要用7+127的二进制数表示,也就是:111+01111111 = 10000110 =134

尾数使用原码表示,绝对值在1与2之间,其中1和小数点都是隐含的,并不直接表示。

上面浮点数的尾数就是0110010001

fa6b6fabaec6c207388e69dee7a87b1c.png

根据这个标准,我们来尝试把一个十进制的浮点数转换为IEEE754标准表示。

例如:178.125

先把浮点数分别把整数部分和小数部分转换成2进制:

整数部分用除2取余的方法,求得:10110010

小数部分用乘2取整的方法,求得:001

合起来即是:10110010.001

转换成二进制的浮点数,即把小数点移动到整数位只有1,即为:1.0110010001 * 2^111,111是二进制,由于左移了7位,所以是111

把浮点数转换二进制后,这里基本已经可以得出对应3部分的值了:

数符:由于浮点数是正数,故为0(负数为1)。

阶码 : 阶码的计算公式:阶数 + 偏移量, 阶码是需要作移码运算,在转换出来的二进制数里,阶数是111(十进制为7),对于单精度的浮点数,偏移值为01111111(127)[偏移量的计算是:2^(e-1)-1, e为阶码的位数,即为8,因此偏移值是127],即:111+01111111 = 10000110=134(10进制)

尾数:小数点后面的数,即0110010001

最终根据位置填到对位的位置上:

f430d624fe04bd31cdf2add3ddf2b162.png

可能有个疑问:小数点前面的1去哪里了?由于尾数部分是规格化表示的,最高位总是“1”,所以这是直接隐藏掉,同时也节省了1个位出来存储小数,提高精度。

输出浮点数二进制位的代码:

利用共用体,不同类型共用一段内存空间,可以实现同样的一段0、1串可以不加改变地(不考虑类型转换规则)按不同的类型解释输出。如在共用体中存储一个float型和一个int型,如果先输入float的变量值,则可用int型按原样的比特串输出,如果先输入的是一个int型的变量值,则可用float型按原样的比特串输出。

#include using namespace std;union {float input;int output;} data;void main(){data.input = 178.125;int h=1;h=h<<31;for(int i=1;i<=32;i++){if((data.output&h)==0)cout<<0;else cout<<1;data.output<<=1;if(i%4==0)cout<

把上面的代码写到一起:

#include using namespace std;union {float input;int output;} data;char flag;void printbin1(int val){int len=sizeof(val)*8;for(int i=1;i<=len;++i){if(val&(1<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值