我们知道,计算机的都是用二进制的开关电路实现的。整数、浮点数、字符串在计算机中的实现都有相应的编码方案,如补码、IEEE574的浮点数表示法、ASCII字符编码方案(用整数表来编码字符)。
1 补码及二进制输出
负数如何用补码表示?
先表示为自然码(原码)。
将自然码的每一位取反码。
在最低位加“1”。
如4个位的补码方案可以表示的数据范围:
补码输出二进制位的代码:
利用移位运算、与运算取最位的方法可以输出补码的每一个二进制位。
#include <iostream>
using namespace std;
void main()
{
while(1)
{
int n;
cin>>n;//最好有边界检查
int h=1;
h=h<<31;//32位,最高位1,其它位是0
for(int i=1;i<=32;i++)
{
if((n&h)==0)
cout<<0;
else cout<<1;
n=n<<1; //左移一位,右位补0
if(i%4==0)
cout<<" ";
}
cout<<endl;
}
system("pause");
}
/*
43
0000 0000 0000 0000 0000 0000 0010 1011
-43
1111 1111 1111 1111 1111 1111 1101 0101
*/
2 浮点数的IEEE574表示法
现代计算机中,一般都以IEEE 754标准存储浮点数,这个标准的在内存中存储的形式为:
对于不同长度的浮点数,阶码与小数位分配的数量不一样,如对于32位的单精度浮点数,数符分配是1位,阶码分配了8位,尾数分配了是23位:
符号位:0表示正;1表示负;
偏移阶码e:e=指数的实际值+127。
如有一个浮点数10110010.001,则指数是7,阶码就要用7+127的二进制数表示,也就是:111+01111111 = 10000110 =134
尾数使用原码表示,绝对值在1与2之间,其中1和小数点都是隐含的,并不直接表示。
上面浮点数的尾数就是0110010001
根据这个标准,我们来尝试把一个十进制的浮点数转换为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
最终根据位置填到对位的位置上:
可能有个疑问:小数点前面的1去哪里了?由于尾数部分是规格化表示的,最高位总是“1”,所以这是直接隐藏掉,同时也节省了1个位出来存储小数,提高精度。
输出浮点数二进制位的代码:
利用共用体,不同类型共用一段内存空间,可以实现同样的一段0、1串可以不加改变地(不考虑类型转换规则)按不同的类型解释输出。如在共用体中存储一个float型和一个int型,如果先输入float的变量值,则可用int型按原样的比特串输出,如果先输入的是一个int型的变量值,则可用float型按原样的比特串输出。
#include <iostream>
using namespace std;
union
{
float input;
int output;
} data;
void main()
{
da = 178.125;
int h=1;
h=h<<31;
for(int i=1;i<=32;i++)
{
i;h)==0)
cout<<0;
else cout<<1;
da;<=1;
if(i%4==0)
cout<<" ";
}
cout<<endl;
system("pause");
}
//0100 0011 0011 0010 0010 0000 0000 0000
把上面的代码写到一起:
#include <iostream>
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<<len-i))
printf("1");
else
printf("0");
if(i%4==0)
printf(" ");
}
printf("n");
}void printbin2(int val)
{
printf("浮点数:符号位+阶码(指数位数+127)+尾数位n");
printf("%2s"," ");
printf("阶码");
printf("%6s"," ");
printf("尾数n");
int len=sizeof(val)*8;
for(int i=1;i<=len;++i)
{
if(val&(1<<len-i))
printf("1");
else
printf("0");
if(i==1 || i==5 || i==9 || i==12)
printf(" ");
if(i>12)
if(i%4==0)
printf(" ");
}
printf("n");
}
void main()
{
while(1)
{
printf("n输入i,int转换为二进制,如178,n");
printf("输入f,float转换为二进制,如178.125:n");
scanf("%c",&flag);
if(flag=='i')
{
printf("请输入一个int:");
int i;
scanf("%d",&i);
printbin1(i);
}
if(flag=='f')
{
printf("请输入一个float:");
float f;
scanf("%f",&f);
da = f;
printbin2);
}
cin.get();
}
}
运行效果:
输入i,int转换为二进制,如178,
输入f,float转换为二进制,如178.125:
i
请输入一个int:1
0000 0000 0000 0000 0000 0000 0000 0001
输入i,int转换为二进制,如178,
输入f,float转换为二进制,如178.125:
f
请输入一个float:1
浮点数:符号位+阶码(指数位数+127)+尾数位
阶码 尾数
0 0111 1111 000 0000 0000 0000 0000 0000
输入i,int转换为二进制,如178,
输入f,float转换为二进制,如178.125:
i
请输入一个int:178
0000 0000 0000 0000 0000 0000 1011 0010
输入i,int转换为二进制,如178,
输入f,float转换为二进制,如178.125:
f
请输入一个float:178.125
浮点数:符号位+阶码(指数位数+127)+尾数位
阶码 尾数
0 1000 0110 011 0010 0010 0000 0000 0000
输入i,int转换为二进制,如178,
输入f,float转换为二进制,如178.125:
-End-
1.文章《〔怎么输出二进制〕c怎么输出二进制!》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《〔怎么输出二进制〕c怎么输出二进制!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好