C語言求原碼的補碼問題,C語言原碼補碼問題

2022-03-04 10:00:13 字數 5590 閱讀 8118

1樓:匿名使用者

必須要用無符號數,位運算的規定就是如此,你想,如果有符號是負數,用哪個來位運算,結果呢

進行與運算是判斷該數是否最大的負數,注意補碼的數值範圍,負數比正數多一個,該數為最小負數,表示範圍內沒有對應的正數

2樓:沙裡波特

通過補碼來求原碼?

你以為補碼原碼是一一對應的嗎?

八位補碼,可代表帶符號數-128~127。

八位原碼,可代表帶符號數-127~127。

由此可知,-128 只有補碼,沒有原碼。

在八位補碼中,0~127,是按照正數的原碼來存放的。

另外的 128~255,則是代表數字-128~-1。

將 129~255 「取反加一」,即為-127~-1 原碼。

而 128,沒有對應的原碼。

八位補碼轉成原碼的程式如下:

unsigned char getbits(unsigned char value)

3樓:匿名使用者

幾位的,如果8位的你可以試試

unsigned char qiufan(signed char x)

其實按照自然的理解最好 ,數字就在計算機裡,不變不換。。。

你所看的什麼原啊反啊的都是你的理解

4樓:匿名使用者

數在計算機中是以二進位制形式表示的。

數分為有符號數和無符號數。

原碼、反碼、補碼都是有符號定點數的表示方法。

一個有符號定點數的最高位為符號位,0是正,1是副。

以下都以8位整數為例,

原碼就是這個數本身的二進位制形式。

例如1000001 就是-1

0000001 就是+1

正數的反碼和補碼都是和原碼相同。

負數的反碼是將其原碼除符號位之外的各位求反[-3]反=[10000011]反=11111100負數的補碼是將其原碼除符號位之外的各位求反之後在末位再加1。

[-3]補=[10000011]補=11111101一個數和它的補碼是可逆的。

為什麼要設立補碼呢?

第一是為了能讓計算機執行減法:

[a-b]補=a補+(-b)補

第二個原因是為了統一正0和負0

正零:00000000

負零:10000000

這兩個數其實都是0,但他們的原碼卻有不同的表示。

但是他們的補碼是一樣的,都是00000000特別注意,如果+1之後有進位的,要一直往前進位,包括符號位!(這和反碼是不同的!)

[10000000]補

=[10000000]反+1

=11111111+1

=(1)00000000

=00000000(最高位溢位了,符號位變成了0)有人會問

10000000這個補碼錶示的哪個數的補碼呢?

其實這是一個規定,這個數表示的是-128

所以n位補碼能表示的範圍是

-2^(n-1)到2^(n-1)-1

比n位原碼能表示的數多一個

c語言原碼補碼問題

5樓:匿名使用者

你的這個是16的,我可以給你用8位解釋一下(原理是一樣的,我打起來比較方便~)

我們知道,8位二進位制的補碼錶示範圍是-128~127對吧。

而在計算機中資料都是以二進位制補碼進行儲存的,那麼-128的儲存方式就是1000 0000,而它是沒有原碼和反碼的,所以你不太能驗證,對吧。

這是因為在計算機中,為了溢位特意定義的一個小玩意兒~

所以放到16來解釋,它的最小值也是-32768。

但這已經是最小的數了,再減就會溢位……(理論上是這樣的)

但是現實中的程式編譯有一定的容錯性,只要到了一定的計算機承認的位數就變成-1了。

這是因為計算機中的數好像一個輪迴……

這個是我的計算機能接受的範圍。

(我的計算機是32位的~)

經過實踐驗證了我說的東西……

如果你的程式要求指定了16位,那麼就是-1,如果高於16位,就是 -32769。

6樓:匿名使用者

整數有正整數和負整數,為了表示負數,一般用最高位來表示符號,因此,最高位是不能用來表示數值的。所以,一個16位的整數最大值為:

2^15=32767(10)=7fff(16)=0111 1111 1111 1111(2),括號後面是進位制。

也就是除去最高位,用來儲存數值的位數是總位數-1,也就是15位。

而用1代表負數,0代表正數,按理,最小負數就應該是最高位設1:

ffff(16)= - 32767 = 1111 1111 1111 1111(2)

但是這樣的話,0值就有正負之分了,但數學上0是中性的沒有正負之分,那麼假如保留正0代表0,另一個,也就是1000 0000 0000 0000(2)就浪費了。因此編碼專家採用補碼錶示法來表示負數,而正數保留原來的編碼形式,叫做原碼錶示法。

補碼是在原碼基礎上按位取反+1,也即:

取-32767的絕對值,也即去符號為32767(10)=7fff(16)=0111 1111 1111 1111(2)

按位取反:1000 0000 0000 0000(2)

+1:1000 0000 0000 0001(2)

轉換成16進位制就是:8001

列印輸出時,由於最高位為1,因此係統認為是負數,就按補碼解碼,輸出為 -32767。

再來看看 -1

取-1的絕對值後的為1(10)=0001(16)=0000 0000 0000 0001(2)

按位取反:1111 1111 1111 1110(2)

+1:1111 1111 1111 1111(2)

轉換成16進位制: ffff

同樣列印輸出時按補碼解碼,輸出為-1

可見負數的絕對值越小(比如1),補碼數值部分越大(7fff),絕對值越大7fff,補碼數值部分越小0001,使得編碼與原碼的編碼相反。這樣,負0編碼就可以看做 -32768了,把負0編碼利用起來了。

驗證一下 -32768:

取-32768的絕對值為32768(10)=8000(16)= 1000 0000 0000 0000(2)

按位取反: 0111 1111 1111 1111(2)

+1:1000 0000 0000 0000(2)

轉換成16進位制:8000

如果不用補碼錶示而是用原碼錶示負數數值,那麼編碼1000 0000 0000 0000(2)表示的是負0,且負數端最小值為 -32767,而採用補碼錶示,負0這個編碼可以利用起來用來表示-32768。使得整數範圍增加了1,達到-32768- +32767 ,不浪費編碼空間。

7樓:

1. 原碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進位制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符號位. 因為第一位是符號位, 所以8位二進位制數的取值範圍就是:

[1111 1111 , 0111 1111]

即[-127 , 127]

原碼是人腦最容易理解和計算的表示方式.

2. 反碼

反碼的表示方法是:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可見如果一個反碼錶示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.

3. 補碼

補碼的表示方法是:

正數的補碼就是其本身

負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]補

[-1] = [10000001]原 = [11111110]反 = [11111111]補

對於負數, 補碼錶示方式也是人腦無法直**出其數值的. 通常也需要轉換成原碼在計算其數值.

你給的10000000 00000000是用補碼錶示的。

也就是說:-32768的原碼是:11000000000000000

那麼他的補碼就是符號位不變,其餘各位取反再加1。

希望能幫到你。

用c語言編一個程式,使給出一個數的原碼,求得反碼,補碼。

8樓:匿名使用者

#include

int main()

j = i-1;

ab[0] = af[0] = a[0];//符號位始終不變if(a[0] == 1)

}k = i;

for(; i > 0; i--)

af[i] = 1 - a[i];

for(i = k; i > 0; i--)//補碼從末位數起第一個不為0,以後均取反

ab[i] = 1 - a[i];

}else

}printf("對應的反碼是:\n");

for(i = 0; i <= j; i++)printf("%d", af[i]);

printf("\n");

printf("對應的補碼是:\n");

for(i = 0; i <= j; i++)printf("%d", ab[i]);

}在vc下編譯測試通過。另,本**未考慮輸入非法問題,所輸入的數字智慧由1和0組成

c語言,原碼補碼轉換,-12345求其補碼,求教! 5

9樓:匿名使用者

正數原、反、補碼相同。

負數的原碼、反碼、補碼不同。

以兩個位元組(16位)為例(short型別)來理解一下:

(-1)原=1000 0000 0000 0001 最高位為符號位1負,0正,資料總長度為16bits

(-1)反=1111 1111 1111 1110 原碼除符號位外,逐位取反

(-1)補=1111 1111 1111 1111 反碼+1

由此,我們來看-12345的補碼:

(-12345)原=1011 0000 0011 1001

(-12345)反=1100 1111 1100 0110

(-12345)補=1100 1111 1100 0111

感覺你理解出錯,是因為沒有按位元組來認識資料的儲存,計算機中的資料最小儲存單位為位元組,一個位元組佔8位,一般情況下(32位機)資料的儲存空間大小定義為:

char 1byte

short 2bytes

int 4bytes

long 4bytes

float 4bytes

double 8bytes

在c語言程式中,可以用sizeof命令來檢視某型別的空間大小,如:printf("%d" , sizeof(long) );可以自己寫程式測試一下你的機器。

C語言的問題C語言問題C語言問題

若有說明語句double p,a 則能通過scanf語句正確給輸入項讀入資料的程式段是 解 p a 將a的地址賦值給p,scanf lf p 從鍵盤獲取一個數值賦值給地址p指向的變數 所以選d 有函式fun的定義形式如下。int fun float f 則以下對函式fun的呼叫語句中,不正確的是 a...

在C語言中,「原碼,反碼和補碼」有什麼不同啊

正數的原碼,反碼和補碼都一樣的,而負數就不一樣了 計算機為了讓所有的數都是進行同一個加法運算,就有了原碼,反碼和補碼的產生 負數的補碼等於它的絕對值的原碼取反後得到這個負數的反碼,而在反碼的基礎上加1就變成了這個負數的補碼了 下面我用8位的來舉例 最高位是符號位 45原碼 00101101 反碼 0...

C語言問題,求大神,C語言問題,求大神解答!

include int main char str 2000 gets str gets str int i 0 while i 2000 bool bb false for int i 0 i n i if bb printf mmm n return 0 先給你改好的 吧,沒做大手術,按你的思路...