C語言閱讀題中的進位轉換
近期做了一道閱讀題,裡面涉及十進位,二進位,八進位,十六進位的轉換。這是每年春考必考的題目。必須要掌握的知識點。
一、題目如下:寫出程序段的運行結果
short a=1;
printf(「%d,%o,%x,%u」,a,a,a,a);
如果a=1,這道題目涉及的是10進位轉換成8進位和16進位的方法。
1)十進位轉化8進位:用十進位數作為被除數,8作為除數,取商數和餘數,直到商數為0的時候,將餘數倒過來就是轉化後的結果
例如36轉換成8進位:36=(44)8 即%o輸出的結果:44
2)十進位轉化16進位:用十進位數作為被除數,16作為除數,取商數和餘數,直到商數為0的時候,將餘數倒過來就是轉化後的結果。方法同上。
例如36轉換成16進位:36=(24)16 即%x輸出的結果:24
%u:因為是正數, 輸出結果也是:1
二、題目如下:寫出程序段的運行結果
short a=-1;
printf(「%d,%o,%x,%u」,a,a,a,a);
如果a=-1,這道題目涉及的是2進位轉換成8進位和16進位的方法。
C語言中整型數據在內存中以補碼形式存儲。涉及以下知識點
1)原碼
將最高位做為符號位(0代表正,1代表負),其餘各位代表數值本身的絕對值
+1的原碼: 0 0000000 00000001
-1的原碼: 1 0000000 00000001
2)反碼
正數的反碼和原碼相同
+1的反碼: 0 0000000 00000001
負數的反碼:符號位為1,其他各位在原碼基礎上取反
-1的反碼: 1 1111111 11111110
3)補碼
正數:原碼,反碼補碼都相同
負數:最高位為1,其餘各位原碼取反,再 + 1或者反碼+1
+1的補碼: 0 0000000 00000001
-1的補碼: 1 1111111 11111111
由此可知,正數的原碼,反碼,補碼相同。
而負數的補碼等於其反碼+1;反碼等於其原碼最高位不變,其餘各位取反。
再次回歸到此題:short a=-1;
printf(「%d,%o,%x,%u」,a,a,a,a);
若想正確輸出%o,%x還需要知道二進位、八進位、十六進位之間的對應關係。有了三者之間對應關係,解此題就很簡單了。
1位八進位數對應3位二進位數;1位十六進位數對應4位二進位數
八進位
二進位
十六進位
二進位
0
000
0
0000
1
001
1
0001
2
010
2
0010
3
011
3
0011
4
100
4
0100
5
101
5
0101
6
110
6
0110
7
111
7
0111
8
1000
9
1001
A
1010
B
1011
C
1100
D
1101
E
1110
F
1111
有了這個關係對應表:
%o: 1位八進位數對應3位二進位數
可以把-1的補碼 從低位三個為一組 分組 1 111 111 111 111 111
二進位
1
111
111
111
111
111
八進位
1
7
7
7
7
7
%o的輸出結果為:17777
%x: 1位十六進位數對應4位二進位數
可以把-1的補碼 從低位四個為一組 分組 1111 1111 1111 1111
二進位
1111
1111
1111
1111
十六進位
F
F
F
F
%x的輸出結果為:FFFF
%u:無符號數,所有位都用來表示數的大小。11111111 11111111隻需要把二進位轉換成10進位就可以了。也可以把我們剛求的八進位或十六進數轉換成10進位。
例如:(FFFF)16=( )10
方法:從最低位給16進位數編位置號0,1,2等。然後以16為底,位置號為指數展開求和
=15*163+15*162+15*161+15*160=65535(八進位轉換成10進位的方法同上)
%u輸出結果:65535
這裡涉及了二,八,十六,十進位的轉換,希望能幫助你!
每個人努力奮鬥,都是為了能更好的生活
拿出你的決心,去努力一把!
喜歡請收藏 ,關注我!