A. 源碼反碼與補碼
8位2進制原碼反碼補碼表示法:第一位是符號位,正數為0負數為1
-67的原碼是11000011,換成反碼符號位不變,其他各位依次求反:
10111100,換成補碼只在反碼基礎上末位加1:
10111101。
55的原碼00110111,正數原碼反碼補碼相同。
補碼實現55-67:00110111
+10111101
---------------------------
11110100
把這個補碼末位減一,符號位不變各位取反得到結果的原碼表示:10001100,
轉換成十進制剛好等於-12,驗證了結果11110100是正確的。
B. 小數和分數的原碼&補碼怎麼做啊
一、小數部分的原碼和補碼可以表示為兩個復數的分子和分母,然後計算二進制小數系統,根據下面三步的方法就會找出小數源代碼和補碼的百位形式。
37/64=100101B/2^6=0.100101B
-51/128=110011B/2^7=0.0110011B
二、將十進制十進制原始碼和補碼轉換成二進制十進制,然後根據下面三步的方法求出十進制源代碼和補碼形式。一個
0.375=0.011B
0.5625=0.1001B
三、二進制十進制對應的原碼和補碼
[37/64]源代碼=[0.100101B]源代碼=00100101B
[-51/128]源代碼=[0.0110011b]源代碼=10110011B
[0.375]原碼=[0.011b]原碼=00110000B
[0.5625]源代碼=[0.1001B]源代碼=01001000B
[37/64]補體=[0.100101B]補體=00100101B
[-51/128]補體=[0.0110011b]補體=11001101B
[0.375]補碼=[0.011b]補碼=00110000B
[0.5625]補體=[0.1001B]補體=01001000B
(2)代碼顯示補碼的源碼擴展閱讀:
原碼、逆碼、補碼的使用:
在計算機中對數字編碼有三種方法,對於正數,這三種方法返回的結果是相同的。
+1=00000001[原碼]=00000001[逆碼]=00000001[補碼]
對於這個負數:
對計算機來說,加、減、乘、除是最基本的運算。有必要使設計盡可能簡單。如果計算機能夠區分符號位,那麼計算機的基本電路設計就會變得更加復雜。
負的正數等於正的負數,2-1等於2+(-1)所以這個機器只做加法,不做減法。符號位參與運算,只保留加法運算。
(1)原始代碼操作:
十進制操作:1-1=0。
1-1=1+(-1)=00000001[源代碼]+10000001[源代碼]=10000010[源代碼]=-2。
如果用原代碼來表示,讓符號位也參與計算,對於減法,結果顯然是不正確的,所以計算機不使用原代碼來表示一個數字。
(2)逆碼運算:
為了解決原碼相減的問題,引入了逆碼。
十進制操作:1-1=0。
1-1=1+(-1)=00000001[源代碼]+10000001[源代碼]=00000001[源代碼]+11111110[源代碼]=11111111[源代碼]=10000010[源代碼]=-0。
使用反減法,結果的真值部分是正確的,但在特定的值「0」。雖然+0和-0在某種意義上是相同的,但是0加上符號是沒有意義的,00000001[源代碼]和10000001[源代碼]都代表0。
(3)補充操作:
補語的出現解決了零和兩個碼的符號問題。
十進制運算:1-1=0。
1-1=1+(-1)=00000001[原碼]+10000001[原碼]=00000001[補碼]+11111111[補碼]=00000000[補碼]=00000000[原碼]=0。
這樣,0表示為[00000000],而之前的-0問題不存在,可以表示為[10000000]-128。
(-1)+(-127)=10000001[源代碼]+11111111[源代碼]=11111111[補充]+10000001[補充]=1000000[補充]=-128。
-1-127的結果應該是-128。在補碼操作的結果中,10000000[補碼]是-128,但是請注意,由於-0的補碼實際上是用來表示-128的,所以-128沒有原碼和逆碼。(-128的補碼表10000000[補碼]計算出的00000000[原碼]是不正確的)。
C. 原碼,反碼,補碼和移碼: 原碼:1001101,反碼,補碼,移碼各是多少
解:首位數字表示正負不做變(1為負數,0為正數)
反碼:1110010(正數反碼等於原數,題中為負數,則除首位數對應取反)
補碼:1110011(得出反碼數基礎上末位加一)
移碼:0110011(補碼符號位第一位數字取反)
反碼是數值存儲的一種,多應用於系統環境設置,如linux平台的目錄和文件的默認許可權的設置umask,就是使用反碼原理。
補碼(2's complement)是一種用二進製表示有號數的方法,也是一種將數字的正負號變號的方式。
移碼(又叫增碼)是符號位取反的補碼,一般用指數的移碼減去1來做浮點數的階碼,引入的目的是為了保證浮點數的機器零為全0。
補碼的設計目的是:
1.使符號位能與有效值部分一起參加運算,從而簡化運算規則.
2.使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計 所有這些轉換都是在計算機的最底層進行的,而在我們使用的匯編、C等其他高級語言中使用的都是原碼。
小數和分數的補碼:
1.十進制分數補碼可以先將分子和分母分別表示成二進制數,然後計算出二進制小數,再按下面第三步的方法將求出小數的補碼形式。
2.十進制小數的補碼也應該先將其轉換成二進制小數,再按下面第三步的方法將求出小數的補碼形式。
D. +0或者-0的源碼、反碼、補碼
[+0]原碼=0000 0000, [-0]原碼=1000 0000
[+0]反碼=0000 0000, [-0]反碼=1111 1111
[+0]補碼=0000 0000, [-0]補碼=0000 0000
你會發現,+0和-0的補碼是一樣的。即 0的補碼只有一種表示。
這里解釋一下[-0]補碼是怎麼得來的。
負數的補碼就是反碼整體加一。符號位上的進位舍棄。(所以,舍棄了符號位的補碼的第一位是數值位,不是符號位,符號位舍棄了)
另外解釋一下原碼符號位和補碼符號位的關系,補碼的符號位不是保持原碼的第一位不變,而是 符號位不變,[-0]反碼的第一個1是符號位,尾數中的7個1是數值位,尾數加一後,數值位產生了進位,1111 1111+1=1 0000 0000(計算補碼的過程中,並不是先保證第一位不變,而是保證符號位不變,保證補碼規則是反碼整體加一)。
所以,補碼能表示的數的個數中,比原碼反碼少了一個,所以補碼可以多表示一個真值為-128的數。
但是,多表示的這個數-128比較特殊,只有原碼和補碼,沒有反碼。
-128的補碼是1000 0000。128的補碼為什麼是1000 0000。因為8位二進制的原值表達范圍為:-127至127,共有256個組合序列 0000 0000 至1111 1111 。+128的原值在8位中是表達不出來的。
數值在計算機中是以補碼的方式存儲的,在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。
對於一個數, 計算機要使用一定的編碼方式進行存儲。 原碼, 反碼, 補碼是計算機存儲一個具體數字的編碼方式。
一個數在計算機中的二進製表示形式, 叫做這個數的機器數。
機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1。比如,十進制中的數 +2 ,計算機字長為8位,轉換成二進制就是[00000010]。如果是 -2 ,就是 [10000010] 。
因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 [10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130([10000010]轉換成十進制等於130)。
所以將帶符號位的機器數對應的真正數值稱為機器數的真值。
原碼_網路
反碼_網路
補碼_網路
E. 0xffffffff是多少 C語言編程源代碼中出現這個數字
0xffffffff表示的是一個十六進制數
1.將其轉換為十進制數
0xffffffff=16x10^7+16x10^6+...+16x10^0=4294967295
2.將其轉換為二進制數
十六進制轉換為二進制就是直接把每位轉換成二進制就可以了
f變成二進制:1111,則
0xffffffff = 1111 1111 1111 1111 1111 1111 1111 1111
即32位數都是1的二進制數
F. 怎麼求補碼的原碼
已知一個數的補碼,求原碼的操作其實就是對該補碼再求補碼:
1、如果補碼的符號位為「0」,表示是一個正數,其原碼就是補碼。
2、如果補碼的符號位為「1」,表示是一個負數,那麼求給定的這個補碼的補碼就是要求的原碼。
例如:已知一個補碼為11111001,則原碼是10000111(-7)。因為符號位為「1」,表示是一個負數,所以該位不變,仍為「1」。
其餘七位1111001取反後為0000110;再加1,所以是10000111。
數的表示:
在數的表示上通過人為的定義來消除編碼映射的不唯一性,對轉換後的10000000強制認定為-128。當然對原碼和反碼也可以做這種強制認定,那為什麼原碼和反碼沒有流行起來?原碼和反碼沒有流行起來,是因為在數的運算上對符號位的處理無法用當時已有的機器物理設計來實現。
由於原碼和反碼在編碼時採用了硬性的人工設計,這種設計在數理上無法自動的通過模來實現對符號位的自動處理,符號位必須人工處理,必須對機器加入新的物理部件來專門處理符號位,這加大了機器設計難度,加大的機器成本,不到萬不得已,不走這條路。
網路--補碼
G. 求一個C語言程序使輸入一個數能顯示出計算出它的原碼和補碼並顯示出來(在VC6.0上運行)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
void convert(int num);
void oppose(int n);
int a[16];
void main(void)
{
int num,jdz;
char ans;
while(1)
{
printf("請輸入任意一個十進制整數: ");
scanf("%d",&num);
printf("\n");
printf("其絕對值為: ");
jdz=abs(num);
printf("%d\n\n",jdz);
printf("其原碼為: \n");
convert(jdz);
printf("\n\n");
if(num>=0)
{
printf("其補碼為: \n");
convert(jdz);
printf("\n\n");
}
else
{
printf("其補碼為: \n");
oppose(a[16]);
printf("\n\n");
}
printf("按回車鍵繼續或按ESC鍵結束程序!!!\n");
ans=getch();
while(ans!=13 && ans!=27)
{
ans=getch();
}
if(ans==13) system("cls");
if(ans==27)
{
system("cls");
printf("謝謝使用!!!\n");
break;
}
}
}
void convert(int num) /*定義轉化為原碼的函數*/
{
int i;
a[0]=num%2;
for(i=1;i<=15;i++)
{
a[i]=(num/2)%2;
num/=2;
}
for(i=15;i>=0;i--)
printf("%2d",a[i]);
}
void oppose(int n) /*定義轉化為補碼的函數*/
{
int i;
for(i=0;i<=15;i++)
{
switch(a[i])
{
case 1:a[i]=0;break;
case 0:a[i]=1;break;
}
}
for(i=0;i<=15;i++)
{
a[i]++;
if(a[i]>1) a[i]=0;
else break;
}
for(i=15;i>=0;i--)
printf("%2d",a[i]);
}