一、补码的编码规则:
如果用8位二进制来表示一个整数,可以有2^8=256种编码可能性。
考虑到负数也需要编码,这256种编码被一分为二:代表128个负数和128个非负数。也就是说256种编码代表最小数从-128到最大数127之间的这256个数。这也意味着128到255这些数字没有分配到编码。本应该属于128到255的二进制编码被分配给了负数们。
具体编码的规律如下:
编码00000000代表的整数是0
编码00000001代表的整数是1
编码00000010代表的整数是2
……
编码01111111代表的整数是127
编码10000000代表的整数是-128(而不是128)
编码10000001代表的整数是-127(而不是129)
编码10000010代表的整数是-126(而不是130)
……
编码11111111代表的整数是-1(而不是255)
二、补码转整数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
string s;
cin>>s;
ll ans=0;
for(ll i=0;i<s.size();i++) ans=ans*2+s[i]-'0';
if(ans>=128) ans-=256;
cout<<ans;
return 0;
}
三、整数转补码
先判断正负,再转换
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(n>=0){
cout<<0;
}
else if(n<0){
cout<<1;
n+=128;
}
int top=0,s[109];
do{
s[++top]=n%2;
n/=2;
}while(n>0);
for(int i=0;i<7-top;i++) cout<<0;
for(int i=top;i>=1;i--) cout<<s[i];
return 0;
}