目錄
一、整型
二進位制數、八進位制數和十六進製制數
c語言中的正負數
整型在記憶體中的儲存方式
二、浮點型
浮點型的表示形式
浮點型在記憶體中的儲存方式
浮點型的精度和取值範圍
三、字元型
轉義字元
int (整型)是基本的整數型別,short (短整型)和 long (長整型)是在 int 的基礎上進行的擴充套件,short 可以節省記憶體,long 可以容納更大的值,也可以將 int 省略,只寫 short 和 long。
乙個數字預設就是十進位制的,表示乙個十進位制數字不需要任何特殊的格式。表示其他進製時,為了和十進位制數字區分開來,必須採用某種特殊的寫法,即加字首。二進位制的字首是0b(0b),八進位制的字首是0,十六進製制的字首是0x(0x)。字首不區分大小寫,是0不是o。
八進位制和十進位制不區分大小寫,所以格式控制符都用小寫形式,若使用大寫形式,那麼行為是未定義的;十六進製制區分大小寫,若小寫表明以小寫字母的形式輸出,大寫表明以大寫字母的形式輸出。
標準的c語言並不支援二進位制寫法,只是有些編譯器自己進行了擴充套件才支援二進位制數字,所以並不是所有的編譯器都支援二進位制數字。雖然部分編譯器支援二進位制數字的表示,但是卻不能使用 printf 函式輸出二進位制。
乙個數字不管以何種進製來表示,都能夠以任意進製的形式輸出。數字在記憶體中始終以二進位制的形式儲存,在輸出時從二進位制轉換為其他進製。
如果只看輸出結果,可能無法判斷數字的進製 ,區分不同進製數字的乙個簡單辦法就是在輸出時帶上特定的字首。在格式控制符中加上#即可輸出字首。十進位制數字沒有字首,所以不用加#。如果加上了,那麼它的行為是未定義的。
c語言規定,把記憶體的最高位作為符號位。符號只有正負兩種情況,用1位(bit)就足以表示, 0 表示正數, 1 表示負數。
例子:int 占用 32 位的記憶體,0~30 位表示數值,31 位表示正負號。short、int 和 long 型別預設都是帶符號位的(有符號數),符號位以外的記憶體才是數值位。
如果不希望設定符號位,可以在資料型別前面加上 unsigned 關鍵字表示無符號數,把所有的位都用來儲存數值,這樣能表示的數值範圍大一倍,但是只能儲存正數。
有符號數可以按照無符號數輸出,無符號數也可以按照有符號數輸出,編譯器都不會報錯,至於輸出結果對不對就不管了。當輸出無符號數,那麼在讀取記憶體時就不區分符號位和數值位了,會把所有的記憶體都看做數值位;當輸出有符號數,那麼在讀取記憶體時會把最高位作為符號位,把剩下的記憶體作為數值位。
有符號正數的最高位是 0 ,當按照無符號數的形式讀取時,符號位就變成了數值位,但是該位恰好是 0 而不是 1,所以對數值不會產生影響。如果有符號負數按照無符號數的形式讀取時,那麼結果就會出錯。
在計算機記憶體中,數值一律採用補碼表示。使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。兩個用補碼表示的數相加時,如果最高位(符號位)有進製,則發生溢位。
原碼:將乙個整數,轉換成二進位制,就是其原碼。例子:16-9 = 16+(-9),反碼:正數的反碼就是其原碼;負數的反碼是將原碼中除符號位以外的每一位取反。
補碼:正數的補碼就是其原碼;負數的補碼是其反碼加1。
溢位:當數值過大或過小時,有限的幾個位元組就不能表示,就會發生溢位,最高位會被截去。
16 的補碼為 0001 0000,-9 的原碼為 1000 1001,補碼為 1111 0111。
直接將兩個數的補碼相加: 1111 0111 + 0001 0000 = 1 0000 0111
最高位的1溢位被截去,記憶體中最後剩下 0000 0111,即7。
c語言中常用的小數有兩種型別,分別是 float(單精度浮點型)或 double(雙精度浮點型)。
十進位制形式:寫法和數學中的一樣。在記憶體中,小數以指數形式來表示的。小數在被儲存到記憶體前,首先轉換為:a×2n 。指數形式:aen 或 aen,整個表示式等價於 a×10n 。a 為尾數部分,是乙個十進位制數;n 為指數部分,是乙個十進位制整數;e 或 e 是固定的字元,用於分割尾數部分和指數部分。以指數形式輸出小數時,輸出結果為科學計數法;也就是說,尾數部分的取值為:0 ≤ 尾數 < 10。
較短形式:以十進位制和指數中較短的形式(輸出結果占用最少的字元)輸出小數。%g 預設最多保留六位有效數字,包括整數部分和小數部分;%f 和 %e 預設保留六位小數,只包括小數部分,不足六位以 0 補齊,超過六位按四捨五入截斷。%g 不會在最後強加 0 來湊夠有效數字的位數,而 %f 和 %e 會在最後強加 0 來湊夠小數部分的位數。
a 為尾數,是二進位制形式,且 1 ≤ a < 2;n 為指數,是十進位制形式。其中,2 是固定的,不需要在記憶體中體現出來。於是小數在記憶體中就被分成了三部分:
所有的小數被轉換成指數形式後,尾數的整數部分都為1,無需在記憶體中提現出來,所以乾脆將其截去,只把小數點後面的二進位制放入記憶體中的尾數部分。
c語言把整數作為定點數,而把小數作為浮點數。定點數必須轉換為補碼再寫入記憶體,浮點數沒有這個過程,直接以原碼形式儲存的,沒有符號位,所以要設計乙個巧妙的辦法來區分正負。對於 float,指數占用8bits,能表示從 0~255 的值,取其中間值 127,指數在寫入記憶體前先加上127,讀取時再減去127。
精度指測量值與真實值的接近程度,在c語言中表現為輸出值和真實值的接近程度。
float 和 double 的精度是由尾數的位數決定。
float:223 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即 float 的精度為 6~7 位有效數字。float 和 double 在記憶體中的指數和尾數的位數都是有限的,小數過大或過小都會發生溢位,多出的位數就會被直接截去,這時儲存的就不是小數的真實值,而是乙個近似值。double:252 = 4503599627370496,一共16位,同理,double 的精度為 15~16 位。
float 的取值範圍為: -2128 ~ +2128,也即 -3.40×1038 ~ +3.40×1038;字符集(character set)定義了文字和二進位制的對應關係,為每個字元分配了唯一的編號(編碼值)。計算機在儲存字元時並不是真的要儲存字元實體,而是儲存該字元在字符集中的編號(編碼值)。對於 char 型別來說,它實際上儲存的是 ascii 碼表中的字元,即英文本元。double 的取值範圍為: -21024 ~ +21024,也即 -1.79×10308 ~ +1.79×10308。
無論在哪個字符集中,字元編號都是乙個整數;可以給字元型別賦值乙個整數或者以整數的形式輸出字元型別。反之也可以給整數型別賦值乙個字元或者以字元的形式輸出整數型別。給字元變數賦值乙個字元時,字元會先轉換成 ascii 碼再儲存;賦值乙個整數時,不需要任何轉換,直接儲存。以 %c 輸出字元變數時,會根據 ascii 碼表將整數轉換成對應的字元;以 %d 輸出時,不需要任何轉換,直接輸出。
在c語言中,字元除了可以用實體表示,還可以用編碼值表示。使用編碼值來間接地表示字元的方式稱為轉義字元(escape character)。
轉義字元只能使用八進位制或者十六進製制,不能使用十進位制。以 \ 開頭表示後跟八進位制形式的編碼值,以 \x 開頭表示後跟十六進製制形式的編碼值。轉義字元既可以用於單個字元,也可以用於字串,並且乙個字串中可以同時使用八進位制形式和十六進製制形式。
轉義字元的初衷是用於 ascii 編碼,所以它的取值範圍有限,超出範圍的轉義字元的行為是未定義的。對於 ascii 編碼,0到31範圍內的字元為控制字元,它們都是看不見的,不能在顯示器上顯示,甚至無法從鍵盤輸入,只能用轉義字元的形式來表示。但是直接使用 ascii 碼記憶不方便,也不容易理解,所以,針對常用的控制字元,c語言又定義了簡寫方式。
轉義字元
意義ascii碼值(十進位制)
\a響鈴(bel)
\b退格(bs) ,將當前位置移到前一列
\f換頁(ff),將當前位置移到下頁開頭
\n換行(lf) ,將當前位置移到下一行開頭
\r回車(cr) ,將當前位置移到本行開頭
\t水平製表(ht)
\v垂直製表(vt)
單引號雙引號
反斜槓單引號、雙引號、反斜槓是特殊的字元,不能直接表示,使用時必須要轉義,在前面加上 / 。
C語言基本資料型別
2.各種資料型別介紹 2.1整型 整形包括短整型 整形和長整形。2.1.1短整形 short a 1 2.1.2整形 一般佔4個位元組 32位 最高位代表符號,0表示正數,1表示負數,取值範圍是 2147483648 2147483647,在記憶體中的儲存順序是地位在前 高位在後,例如0x12345...
C語言基本資料型別
1.資料型別可以理解為固定記憶體大小的別名 c語言誕生之前的彙編時代,在低端的機器語言裡面沒有資料型別的概念,如何操作記憶體呢?當然我們知道記憶體的起始位址和記憶體大小,就可以操作這段記憶體了。然而在程式設計過程中,我們發現經常用到1個位元組,2個位元組和4個位元組的記憶體。我們每次呢都會去記這個2...
C語言基本資料型別
記得大學一年級上的基礎課中就有c 語言,剛開始學的時候感覺很難 雖然現在感覺也不容易 最近開始重新翻開c語言的書籍,對於其中的基本資料型別感覺很重要也別有一翻feel。c語言基本資料型別有 int,short int long int double float,char.不管是整型,浮點型以及字元型...