基礎知識:
對於正數
正數:原碼=反碼=補碼
對於負數:
原碼->補碼 和 補碼->原碼 的規律一樣,都是 「取反加1」
eg:以 -3 為例(前面的1,是符號位,0為正,1為負。不參與運算)
原碼->補碼:111(原碼)=100(反碼)=101(補碼)
補碼->原碼:101(補碼)->110->111(原碼)
#define bitnum 8
/*實現的是32位的轉化*/
#define datetype int
/*引數:num: 要做轉化的數值
引數:code : 存放得到的二進位制陣列
引數:bit num: 資料的位數
引數:cur_iter_num: 遞迴的次數,初值是0
*//*作用:將原始碼轉成補碼*/
void
findnegcode_iter
(datetype num,
char
* code,
int bitnum,
int cur_iter_num)
/*作用:將10進製數轉化成二進位制輸出*/
void
findoricode
(datetype num,
char
*code,
int bitnum)
/* 將二進位制數轉成10進製數*/
intchangedate
(char
*str)
return sum;
}int
main()
;char negcode[bitnum +1]
=;/*原始碼轉補碼 輸入10進製原始碼,返回二進位制補碼*/
findnegcode_iter(96
,negcode,bitnum,0)
;/* 將二進位制數轉成10進製數*/
negresult =
changedate
(negcode)
;printf
("negresult = %d\n"
,negresult)
;/*原碼的補碼 二進位制輸出*/
findoricode
(negresult, negcode, bitnum)
;printf
("negresult=%s\n"
, negcode)
;/*補碼轉原碼 輸入10進製補碼,返回二進位制原碼*/
findnegcode_iter(74
,oricode,bitnum,0)
;/* 將二進位制數轉成10進製數*/
oriresult =
changedate
(oricode)
;printf
("oriresult = %d\n"
,oriresult)
;/*補碼對應的原碼二進位制輸出*/
findoricode
(oriresult, oricode, bitnum)
;printf
("oriresult=%s\n"
, oricode)
;return0;
}
補碼轉原碼(算術左移一位負變正)
很早之前寫過一篇關於補碼的文章,但是長時間不看又差不多忘記了,翻出來看發現寫的挺爛的,有點沒說明白,所以希望這裡能說明白 關於補碼,我們知道 在計算機中,一切的一切都是用補碼儲存 打乙個比喻,東西在計算機中是用各種編碼儲存,不論是字元還是指標 指標也是儲存的資料 都是用補碼儲存。我們寫的 相當於是乙...
原碼 補碼 反碼以及位運算
2 位運算 機器數是乙個數在計算機中的二進位制表示形式,機器數是帶符號的,在計算機中用乙個數的最高位 第一位 存放符號,正數為0,負數為1。例如1 帶符號即 1 在計算機中的最終表示形式為 0000 0001,依此類推 1的二進位制為 1000 0001。這種表示方式又叫做原碼,其中0的原碼為000...
128的補碼及原碼 反碼 補碼
乙個位元組佔8位 乙個字長為n的機器數能表示不同的數字的個數是固定的2 n個,n 8時2 n 256 用來表示有符號數,數的範圍就是 2 n 1 2 n 1 1,n 8時,這個範圍就是 128 127。用來表示無符號數,就不需要用一位來表示符號位,n位機器數全部用來表示是數值,這時表示數的範圍就是0...