本節主要闡述整數在計算機中的表示方式:無符號數和有符號數。介紹其範圍、編碼方式,以及有無符號相互轉換、數值擴充套件的原則。
c語言中支援有符號整數和無符號整數。
1. 無符號整數表示範圍即w位位向量能夠表示的最大範圍,例如unsigned char是乙個位元組表示,所以無符號數的表示範圍為0~255。
2. 有符號數的有效位中,有一位是符號位,所以能表示的範圍是無符號數的一半,而且由於0的符號位與正數一致,所以能表示的正數個數比負數個數少1。
3. 在不同字長的機器上,由於某些整型位元組數不同,所以能表示的範圍也不同。例如32位機器上的int和long int由於位元組數相同,所以範圍也相同,但是在64位機器上的long int所用位元組是32位上的2倍,故所能表示的範圍也大很多。
4. c語言標準定義了每種資料型別所能夠表示的最小的取值範圍。
為什麼要用補碼來編碼有符號數?
1. 對0具有唯一的編碼(相對於原碼和反碼);
2. 位向量公式與原碼幾乎一致(除了首位解釋為負權);
3. 可以直接進行布林運算;
確定了這兩點,就奠定了轉換的基調。具體結果以4位為例:
先做幾點說明:
- 4位二進位制表示的有符號數範圍為:-8 ~ 7,表示的無符號數範圍為:0 ~ 16
- u2t表示無符號轉化有符號,t2u表示有符號轉化無符號(u為unsigned,t為two』s complementt,即補碼)。
- 轉換過程將以8為分界點,在0~8範圍內的數,有符號和無符號都有相同的結果,例如4=b2u(4),5=b2u(5),但在這個範圍以外的值,就需要加上或者減去16,負數轉無符號數需要加16,大於等於8的無符號數轉有符號數需要減去16。
轉換結果如下面兩張圖所示:
這裡的數值擴充套件和位移有點像,那有什麼不同呢?
- 位移數運算,而數值擴充套件只是將乙個較小的資料型別轉化成乙個較大的資料型別;
- 位移有向左位移、向右位移,而擴充套件顧名思義只有將小的擴充套件成大的一說;
擴充套件分兩種:
- 0擴充套件:開頭補0,即類似於位移中的邏輯位移;
- 符號擴充套件:開頭補符號位,即類似於位移中的算術位移;
羅馬數表示整數
羅馬數字共有七個,即 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 按照下面三條規則可以表示任意正整數。重複數次 乙個羅馬數字重複幾次,就表示這個數的幾倍。右加左減 在乙個較大的羅馬數字的右邊記上乙個較小的羅馬數字,表示大數字加小數字。在乙個較大的數字的左邊記上乙個較小的...
整數表示問題。
我們知道,如果x,y互素時ax by可以表示任意整數 其中a,b為整數 如果設定條件x,y 0,並且ax by 0時,求能表示的整數集中連續的整數最小的是多少?例如輸入x 3,y 4.整數集為0,3,4,6,7,8,9 則輸出6 輸入1行x和y,輸出一行表示最小整數 其中x,y為32位整數且互素。現...
整數表示法
整數表示法 題目詳情 我們知道,如果x,y互素時ax by可以表示任意整數 其中a,b為整數 如果設定條件x,y 0,並且ax by 0時,求能表示的整數集中連續的整數最小的是多少?例如輸入x 3,y 4.整數集為0,3,4,6,7,8,9 則輸出6 輸入1行x和y,輸出一行表示最小整數 其中x,y...