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 先給你改好的 吧,沒做大手術,按你的思路...