任意位寬的補碼轉原碼,原碼轉補碼

2021-10-09 11:39:03 字數 1659 閱讀 2588

基礎知識:

對於正數

正數:原碼=反碼=補碼

對於負數:

原碼->補碼 和 補碼->原碼 的規律一樣,都是 「取反加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...