一,八進制數(shù)
C,C++語言中,如何表達一個八進制數(shù)呢?如果這個數(shù)是 876,我們可以斷定它不是八進制數(shù),因為八進制數(shù)中不可能出7以上的阿拉伯?dāng)?shù)字。但如果這個數(shù)是123、是567,或12345670,那么它是八進制數(shù)還是10進制數(shù),都有可能。
所以,C,C++規(guī)定,一個數(shù)如果要指明它采用八進制,必須在它前面加上一個0,如:123是十進制,但0123則表示采用八進制。這就是八進制數(shù)在C、C++中的表達方法。
由于C和C++都沒有提供二進制數(shù)的表達方法,所以,這里所學(xué)的八進制是我們學(xué)習(xí)的C與C++語言的數(shù)值表達的第二種進制法。 現(xiàn)在,對于同樣一個數(shù),比如是100,我們在代碼中可以用平常的10進制表達,例如在變量初始化時: int a = 100;
我們也可以這樣寫:
int a = 0144; //0144是八進制的100;一個10進制數(shù)如何轉(zhuǎn)成8進制,我們后面會學(xué)到。 千萬記住,用八進制表達時,你不能少了最前的那個0。否則計算機會通通當(dāng)成10進制。不過,有一個地方使用八進制數(shù)時,卻不能使用加0,那就是我們學(xué)的用于表達字符的“轉(zhuǎn)義符”表達法。
八進制數(shù)在轉(zhuǎn)義符中的使用
我們學(xué)過用一個轉(zhuǎn)義符'\'加上一個特殊字母來表示某個字符的方法,如:'\n'表示換行(line),而'\t'表示Tab字符,'\''則表示單引號。今天我們又學(xué)習(xí)了一種使用轉(zhuǎn)義符的方法:轉(zhuǎn)義符'\'后面接一個八進制數(shù),用于表示ASCII碼等于該值的字符。 比如,查一下第5章中的ASCII碼表,我們找到問號字符(?)的ASCII值是63,那么我們可以把它轉(zhuǎn)換為八進值:77,然后用 '\77'來表示'?'。由于是八進制,所以本應(yīng)寫成 '\077',但因為C,C++規(guī)定不允許使用斜杠加10進制數(shù)來表示字符,所以這里的0可以不寫。
事實上我們很少在實際編程中非要用轉(zhuǎn)義符加八進制數(shù)來表示一個字符,所以,這里大家僅僅了解就行。
二,十六進制數(shù) 如果不使用特殊的書寫形式,16進制數(shù)也會和10進制相混。隨便一個數(shù):9876,就看不出它是16進制或10進制。 C,C++規(guī)定,16進制數(shù)必須以 0x開頭。比如 0x1表示一個16進制數(shù)。而1則表示一個十進制。另外如:0xff,0xFF,0X102A,等等。其中的x也不區(qū)分大小寫。(注意:0x中的0是數(shù)字0,而不是字母O)
以下是一些用法示例:
int a = 0x100F;
int b = 0x70 + a;
至此,我們學(xué)完了所有進制:10進制,8進制,16進制數(shù)的表達方式。最后一點很重要,C/C++中,10進制數(shù)有正負之分,比如12表示正12,而-12表示負12,;但8進制和16進制只能用于表達無符號的正整數(shù),如果你在代碼中里:-078,或者寫:-0xF2,C,C++并不把它當(dāng)成一個負數(shù)。
十六進制數(shù)在轉(zhuǎn)義符中的使用 轉(zhuǎn)義符也可以接一個16進制數(shù)來表示一個字符。如在6.2.4小節(jié)中說的 '?' 字符,可以有以下表達方式:
'?' //直接輸入字符
'\77' //用八進制,此時可以省略開頭的0
'\0x3F' //用十六進制
同樣,這一小節(jié)只用于了解。除了空字符用八進制數(shù) '\0' 表示以外,我們很少用后兩種方法表示一個字符。
三,原碼、反碼、補碼 結(jié)束了各種進制的轉(zhuǎn)換,我們來談?wù)劻硪粋€話題:原碼、反碼、補碼。 我們已經(jīng)知道計算機中,所有數(shù)據(jù)最終都是使用二進制數(shù)表達。 我們也已經(jīng)學(xué)會如何將一個10進制數(shù)如何轉(zhuǎn)換為二進制數(shù)。 不過,我們?nèi)匀粵]有學(xué)習(xí)一個負數(shù)如何用二進制表達。 比如,假設(shè)有一 int 類型的數(shù),值為5,那么,我們知道它在計算機中表示為: 00000000 00000000 00000000 00000101 5轉(zhuǎn)換成二進制是101,不過int類型的數(shù)占用4字節(jié)(32位),所以前面填了一堆0。 現(xiàn)在想知道,-5在計算機中如何表示? 在計算機中,負數(shù)以其正值的補碼形式表達。
什么叫補碼呢?這得從原碼,反碼說起。
原碼:一個整數(shù),按照絕對值大小轉(zhuǎn)換成的二進制數(shù),稱為原碼。 比如 00000000 00000000 00000000 00000101 是 5的 原碼。 反碼:將二進制數(shù)按位取反,所得的新二進制數(shù)稱為原二進制數(shù)的反碼。 取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。
反碼是相互的,所以也可稱: 11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互為反碼。
補碼:反碼加1稱為補碼。
也就是說,要得到一個數(shù)的補碼,先得到反碼,然后將反碼加上1,所得數(shù)稱為補碼。
比如:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。
那么,補碼為: 11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011 所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011。轉(zhuǎn)換為十六進制:0xFFFFFFFB。 再舉一例,我們來看整數(shù)-1在計算機中如何表示。
假設(shè)這也是一個int類型,那么: 1、先取1的原碼:00000000 00000000 00000000 00000001
2、得反碼: 11111111 11111111 11111111 11111110
3、得補碼: 11111111 11111111 11111111 11111111 可見,-1在計算機里用二進制表達就是全1。16進制為:0xFFFFFF。 一切都是紙上說的……說-1在計算機里表達為0xFFFFFF,我能不能親眼看一看呢?當(dāng)然可以。利用C++ Builder的調(diào)試功能,我們可以看到每個變量的16進制值。
|