數制轉換c語言
A. 用c語言編寫二進制轉換十進制的程序。
1、為了完成進制的轉換,在主函數中聲明了個函數Sum,主要用於將二進制的每一位轉換為十進制後的數相加,返回值就是相加後的和。另外定義了一個數組array[8],用於存放輸入的八位二進制數。
B. C語言之進制之間的轉換
計算機中一般是二進制敬罩爛、八進制、十進制和十六進制之間的相互轉換,主要是圍繞 二進制 進行轉換,也就是說 二進制 是核心。
[圖片上傳失敗...(image-9e6904-1533226303616)]
第一:間接法—把十進制轉成二進制,然後再由二進制轉成八進制或者十六進制。這里不再做圖片用法解釋。
第二:直接法—把十進制轉八進制或者十六進制按照除8或者16取余,直到商為0為止。
方法為:把八進制、十六進制數按權展開、相加即得十進制數。
第一種:他們之間的轉換可以先轉成二進制然後再相互轉換。
第二種:他們之間的轉換可以先轉成十進制然後再相互轉換。
數據在內存中存儲的時候都是以 二進制 的形式存儲的.int num = 10; 原碼、反碼、補碼都是二進制.只不過是二進制的不同的表現形式.數據是以 補碼 的二進制存儲的.
1個int類型的變數.在32位編譯器內存中占據4個位元組(這里不單獨討論int類型的具體的位元組數,若不明白看下面的拓展資料)
00000000 00000000 00000000 00000000
如果最高為是0 那麼表示這個數是1個正數
如果最高為是1 那麼表示這個數是1個負數
最高位表示符號位. 剩下的位數.是這個數的絕對值的二進制.
絕對值: 正數的絕對值是自己,負數的絕對值去掉負號.
正數的反碼就是其原碼.負數的反碼就亮漏是在其原碼的基礎之上 符號位不變,其他位取反.
正數的補碼就是其原碼.負數的補碼就是在其反碼的基礎之上+1
任何數據都是以其 二進制的補碼 形式存儲在內存中的
計算機中只有加法沒有減法.為了更加低成本的計算出結果,所以使用補碼來存儲數據.
3 - 2; 這個減法運悶沒算對於計算機而言它的理解是 3 + (-2);
C. 十進制如何轉二為二進制(C語言)
c語言編程將十進制轉化為2進制可按手工轉換規則進行程序轉換。
整數佔四個位元組,每位元組8位,共32位。所以,可以定義一個32位的數組來存儲轉換結果。
循環將整數進行除2取余數,余數存儲到數組中。
當整數整除為0時,結束循環
逆序輸出數組,得到轉換結果
參考代碼:
#include <stdio.h>
void main()
{
int c[32],i=0,n;
scanf("%d", &n) ; //輸入待轉換整數n
do {
c[i++]=n%2;
n/=2;
} while(n!=0) ;
for(i--;i>=0;i--)
printf("%d",c[i] );
printf("\n");
}
D. C語言進制及其轉換
###常用的幾種進制:任何進制計數,高位都在左邊,右邊為低位,在高位前補0對於整個數的值得大小沒有影響,但絕對不可以在低位後補0,因為這樣會改變數的大小;
1.最常用的:十進制
要點 a:在十進制中的每一位數的取值范圍必須在0~9,如果其中某一位數超過9,則必須用多位數進行表示,其中低位和相鄰高位之間的運算關系遵守 「逢十進一」 ;
要點 b:運算
例:147.75=1*10^2+4*10^1+7*10^0+7*10^-1+5*10^-2
2.二進制:
要點 a:在二進制中,每一位只能在0~1中取,所以二進制的基數2,其中低位和相鄰的高位之間的運演算法則遵循 「逢二進一 」(像十進制的逢十進一樣);
要點 b:運算
例:101.1=1*2^2+0*2^1+1*2^0+1*2^-1=(5.5)10
要點 c:二進制的前綴為:0b或b開頭
3.八進制:
要點 a:八進制的每一位數只能在0~8中取一個,並且基數的基數是8,其中低位和相鄰的高位之間的運算關系遵循 「 逢八進一 」;
要點 b:運算
例:(12.4)8=1*8^1+2*8^0+4*8^-1=(10.5)10
要點 c :八進制的前綴為0;在八進制數字中的每一位數字在0~8區間;例:0157等
4.十六進制:
要點 a:十六進制數的每一位有16個不同的數碼,分別用0~9、A(10)、B(11)、C(12)、D(13)、
E(14)、F(15)表示。(A~F大小寫均可);計數的基數為16,其中低位和相鄰的高位之間的運算關系遵循 「逢十六進一」;
要點 b:運算
例:(2A.7F)16=2*16^1+10*16^0+7*16^-1+15*16^-2=(42.4960937)10
###進制之間的轉換:
1.二進制與十進制:
規則:以2為底,從低位向高位每一位進行2冪運算,再和與之對應的位進行乘法運算,然後求和;
例:01011011(八位的一個二進制數轉換為十進制數)
0 1 0 1 1 0 1 1
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^1
運算時只需將 0/1 下面相對應的以2為底的冪進行相乘後求和即可:
0*2^7+1*2^6+0*2^5+1*2^4+1*2^3+0*2^2+1*2^1+1*2^0=91;
例:將十進制數57轉換為二進制數:
十進制轉二進制就是對十進制數的一個以2為除數的求余過程:
57 / 2 =28……1
28 / 2 =14……0
14 / 2=7……0
7 / 2 =3……1
3 / 2 =1……1
2 / 2 =0…… 1
@注意: 在書寫二進制的結果時,要倒著寫 :即結果為:111001 或 00111001
2.二進制轉八進制:
對於二進制轉八進制來講,把二進制從低位向高位進行3位二進制數為一個單位進行劃分,也就是說
3位二進制對應1位八進制數。
421 421 421(快捷演算法)
例:二進制: 010 001 101 (與下面八進制的數字相對應)
八進制 : 2 1 5
其中 二進制的010對應的421中,因4對應0,1對應0,所以沒有值,1對應2,所以值為2,所以 以010這3個數為一個單位的數的值為2;二進制中101對應的421中,4對應1,2對應0,1對應1,所以 以101為一個單位的數的值為4+1=5;所以二進制數 010001101 對應的八進制數位 215;
八進制轉二進制:
同樣,只要逆向思維就可以了:一位八進制數對應3位二進制數;
例:八進制 2 1 5
二進制 010 001 101
421 421 421
0+2+0=2 0+0+1=1 4+0+1=5
寫結果時:一般會寫成10001101;程序員一般會將高位數前的0省略,值不變
3.二進制轉十六進制
要點: 對於二進制轉十六進制來講,把二進制從低位向高位進行4位二進制數 做為一個單位進行劃分,也就是說 4位二進制對應1位十六進制數。
例:將 01011110 二進制數轉換為十六進制數
8421 8421
二進制 0101 1110
十六進制 5 E
注釋:同理:5=8*0+4*1+2*0+1*1 E(14)=8*1+4*1+2*1+1*0
所以:寫法為 (01011110)2=(5E)16
十六進制轉二進制:
同樣,只要逆向思維就可以了: 一位十六進制數對應4位二進制數
例: 8 F A
1000 1111 1010
8421 8421 8421
8=8*1+4*0+2*0+1*0 F(15)=8*1+4*1+2*1+1*1 A(10)=8*1+4*0+2*1+1*0
所以:(8FA)16=(100011111010)2
###原碼、反碼、補碼
1.機器數:一個數在計算機中的二進製表現形式;機器數是帶符號的,在計算機用一個數的最高存放符號,正數為0,負數為1;如:十進制中的數+3,計算機字長尾8位,轉換成二進制數就是00000011.如果是-3,那就是10000011;那麼,這里的00000011和10000011就是機器數。
2.真值:因為第一位是符號位,所以機器數的形式值就不等於真正的數值。
3.原碼:原碼就是符號位加上真值的絕對值。
例:+1(原碼)=0000 0001
-1(原碼)=1000 0001
從中可以看出,對於二進制來說,最高位就是符號位,1就是代表的負數,0就代表正數,所以一個8位的二進制數它能表達的取值范圍應該是【11111111,01111111】;即【-127,127】但char類型佔一個位元組,所以取值范圍為【-128,127】
4.反碼:正數的原碼,反碼是一樣的;負數的反碼就是符號位不變,其他位在原碼的基礎上取反,即0變為1,1變為0.
原碼 反碼
+1 +0000 0001 0000 0001
-1 1000 0001 1111 1110
+0 0000 0000 0000 0000
-0 1000 0000 1111 1111
5.補碼:
正數的原碼、反碼、補碼就是其本身;負數的補碼是在其原碼的基礎上,符號位不變,其餘各取反,最後+1(即 在反碼的基礎上+1)
例 : 原碼 反碼 補碼
+1 0000 0001 0000 0001 0000 0001
-1 1000 0001 1111 1110 1111 1111
+0 0000 0000 0000 0000 0000 0000
-0 1000 0000 1111 11111 10000 0000
在最後一行中,-0的補碼得出來是一個9位的二進制數,由於我們測試的是8位,所以,應該把最
最高位捨去,因為數據在存儲的時候是由高到低進行存儲,所以-0的補碼應該是0000 0000
注意:在計算機存儲數據時,計算機是採用二進制 補碼的形式 進行存儲
#include <stdio.h>
int main(){
int x=1;//定義一個Int類型的變數名為x的變數
int y=~x;//~這個是取反符號
printf("%d\n",y);
return 0;
}
輸出結果為:-2
E. C語言如何實現十六進制轉換成十進制
C語言實現十六進制轉換成十進制如下:
例如將十六進制數字 9FA8C 轉換成十進制:
9FA8C = 9×164 + 15×163 + 10×162 + 8×161 + 12×160 = 653964(十進制)。
從右往左看,第1位的位權為 160=1,第2位的位權為 161=16,第3位的位權為 162=256,第4位的位權為 163=4096,第5位的位權為 164=65536 …… 第n位的位權就為 16n-1。
將各個位的數字乘以位權,然後再相加,就得到了十進制形式。
十六進制數的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方。
所以,在第N(N從0開始)位上,如果是是數 X (X 大於等於0,並且X小於等於 15,即:F)表示的大小為 X * 16的N次方。
再例如:十六進制:EA7 = 14×162 + 10×161 + 7×160 = 3751(十進制)。
(5)數制轉換c語言擴展閱讀:
C語言10進制轉16進制
把十進制的數不停除以16的余數按從右到左的順序排起來就是16進制,例如:55/16=0餘5例如100 100/16=6餘4 6/16餘6,所以就是64,再例如1000 1000/16=62餘8 62/16=3餘12 3/16餘3所以結果是3C8 //。
對於整數部分,用被除數反復除以2,除第一次外,每次除以2均取前一次商的整數部分作被除數並依次記下每次的余數。另外,所得到的商的最後一位余數是所求二進制數的最高位。
對於小數部分,採用連續乘以基數2,並依次取出的整數部分,直至結果的小數部分為0為止。
F. c語言把二進制數轉換成十進制數的程序怎麼寫。
需要准備的材料分別有:電腦、C語言編譯器。
1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp。