一、引入
众所周知,我们经常用的电脑(计算机)使用的是二进制补码来存储信息和数字的。二进制补码?什么是二进制补码?本文就来科普一下二进制的原码,反码,补码的概念吧!
二、原码,反码,补码的概念
请注意,本文用的都是 八位二进制来表示(范围-128~127)。
二进制原码
二进制原码的概念:将最高位作为符号位(0是负,1是正),剩下的七位就是这个数的绝对值的二进制。
+1 | 0000 0001 |
-1 | 1000 0001 |
-9 | 1000 1001 |
二进制反码
二进制反码的概念:正数的反码就是其原码,负数的反码是其原码除符号位取反(1变0,0变1)。
数字 | 二进制原码 | 二进制反码 |
+1 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 |
-12 | 1000 1100 | 1111 0011 |
二进制补码
二进制补码的概念:正数的补码就是其原码,负数的补码是其反码+1。
数字 | 二进制原码 | 二进制反码 | 二进制补码 |
+1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-9 | 1000 1001 | 1111 0110 | 1111 0111 |
三、用代码输出一个数N的原码,反码和补码
那我们怎么样用代码输出一个数N的原码,反码和补码呢。(N N不等于0)。
首先,我们要特判一下N是正数还是负数(如果是负数,就标记一下)。
然后,将N的绝对值搞成二进制数,同时输出N的原码(要特判一下二进制数的位数)。
在判断如果是正数,输出N的原码。
如果是负数,再将N的原码除符号位取反输出(要特判一下正负数)。
最后在判断如果是正数,输出N的原码。
如果是负数,再将N的补码+1输出(要注意一下逢二进一,要特判一下正负数)。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,aa[10001],u,a[10001],b[10001],c[10001];
bool cmp=0;
signed main()
{
cin>>n;
if(n<0)cmp=1;
int nn=abs(n);
while(nn>0) //将n转为二进制数
{
aa[++u]=nn%2;
nn/=2;
}
int t=7-u;
for(int i=1;i<=u;i++)
{
a[u-i+1]=aa[i];
}
if(t!=0)
{
for(int i=1;i<=u;i++)
{
a[i+t]=a[i];
a[i]=0;
}
u=7;
}
if(cmp==0)cout<<0;
else cout<<1;
for(int i=1;i<=u;i++) //输出n的原码
{
cout<<a[i];
if(i==3)cout<<' ';
}
cout<<endl;
if(cmp==0)
{
for(int i=1;i<=u;i++)b[i]=a[i];
}
else
{
for(int i=1;i<=u;i++)
{
if(a[i]==1)b[i]=0;
else b[i]=1;
}
}
if(cmp==0)cout<<0;
else cout<<1;
for(int i=1;i<=u;i++) //输出n的反码
{
cout<<b[i];
if(i==3)cout<<' ';
}
cout<<endl;
for(int i=1;i<=u;i++)
{
c[i]=b[i];
}
if(cmp==1)
{
c[u]++;
int sum=u;
while(c[sum]==2 && sum>=1)
{
c[sum]=0;
c[--sum]++;
}
}
if(cmp==0)cout<<0;
else cout<<1;
for(int i=1;i<=u;i++) //输出n的补码
{
cout<<c[i];
if(i==3)cout<<' ';
}
return 0;
}
演示:
本文到这里就结束了,如果觉得写得好的话欢迎点赞+收藏+评论!