補碼與整型的轉換
阿新 • • 發佈:2021-10-08
轉自:https://blog.csdn.net/weixin_43661242/article/details/85031263
https://blog.csdn.net/weixin_45447985/article/details/104328051
1.補碼
8位二進位制表示的範圍:-2^7~2^7-1。
具體編碼的規律如下:
編碼00000000代表的整數是0
編碼00000001代表的整數是1
編碼00000010代表的整數是2
……
編碼01111111代表的整數是127
編碼10000000代表的整數是-128(而不是128)
編碼10000001代表的整數是-127(而不是129)
編碼10000010代表的整數是-126(而不是130)
2.補碼轉換為整數
#include<bits/stdc++.h> usingnamespace 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; }
補碼的符號位是參與運算的,原碼和反碼的符號位不參與運算。
定點整數:
x的補碼=10011;x的真值等於1*1+1*2+0*4+0*8+(-1)*16=-13
轉換為原碼驗證一下,x的原碼=11101,即-(1
所以,在定點整數中,補碼轉換為真值即可將符號位帶入運算,但是權值要根據符號位的具體表示含義做出更改。
所以在上述轉換程式碼中,直接判斷是否超過最大表示,若超過了那麼直接將符號位減去即可表示對應的負數。