數制與編碼
“轉換”的概念在數據表示中的反映


信息的二進制編碼
- 機器級數據分兩大類
- 數值數據:無符號整數、帶符號整數、浮點數(實數)
- 非數值數據:邏輯數(包括位串)、西文字符和漢字
- 計算機內部所有信息都用二進制(即:0和1)進行編碼
- 用二進制編碼的原因
- 制造二個穩定態的物理器件容易(電位高/低,脈沖有/無,正/負極)
- 二進制編碼、計數、運算規則簡單
- 正好與邏輯命題真/假對應,便於邏輯運算
- 可方便地用邏輯電路實現算術運算
- 真值和機器數 ( 非常重要的概念!) 機器數:用0和1編碼的計算機內部的0/1序列
- 真值:真正的值,即:現實中帶正負號的數 例:unsigned short型變量x的真值是127,其機器數是多少? 127=27-1,其機器數為0000 0000 0111 1111
數值數據的表示
- 數值數據表示的三要素
- 進位計數制
- 定、浮點表示
- 如何用二進制編碼 即:要確定一個數值數據的值必須先確定這三個要素。 例如,20137564的值是多少?
- 進位計數制
- 十進制、二進制、十六進制、八進制數及其相互轉換
- 定/浮點表示(解決小數點問題)
- 定點整數、定點小數
- 浮點數(可用一個定點小數和一個定點整數來表示)
- 定點數的編碼(解決正負號問題)
- 原碼、補碼、反碼、移碼 (反碼很少用)
進制數
十進制數,每個數位可用十個不同符號0,1,2,…,9來表示,每個符號處在十進制數中不同位置時,所代表的數值不一樣。 例如,2585.62代表的值是: 2585.62 = 2×103+5×102+8×101+5×100+6×10-1+2×10-2 • 一般地,任意一個十進制數 D=dndn-1 ... d1d0 . d-1d-2 ... d-m (m,n為正整數) • 其值可表示為如下形式: V(D) = dn×10n + dn-1×10n-1 + ...+ d1×101 + d0 ×100 + d-1
×10-1 + d-2 ×10-2+...+d-m ×10-m 其中,di(i=n,n–1, ... ,1,0, –1, –2, ... –m)可以是 0,1,2,3,4,5,6,7,8,9這10個數字符號中的任何一個; “10”稱為基數(base),它代表每個數位上可以使用的不同數字符 號個數。10i 稱為第i位上的權。運算時, “逢十進一”。
二進制數,每個數位可用兩個不同符號0和1來表示,每個符號處在不同位置時,所代表的數值不一樣。 例如,100101.01代表的值是: (100101.01)2 = 1×25 + 0×24+ 0×23 + 1×22 + 0×21 + 1×20+ 0×2-1 + 1×2-2 = 37.25 • 一般地,任意一個二進制數 B=bnbn-1 ... b1b0 . b-1b-2 ... b-m (m,n為正整數) • 其值可表示為如下形式: V(B) = bn×2n + bn-1×2n-1 + ...+ b1×21 + b0 ×20 + b-1 ×2-1 + b-2 ×2-2+...+b-m ×2-m 其中,bi(i=n,n–1, ... ,1,0, –1, –2, ... –m)可以是0或1 “2”稱為基數(base),它代表每個數位上可以使用的不同數字符號個數。2i 稱為第i位上的權。 運算時,“逢二進一”。后綴“B”表示二進制數,如01011010B
R進位計數制

八進制和十六進制
日常生活中用十進制表示數值,計算機中用二進制表示所有信息!
那為什么還要引入 八進制 / 十六進制呢?
八進制 / 十六進制是二進制的簡便表示。便於閱讀和書寫! 它們之間對應簡單,轉換容易。
在機器內部用二進制表示,在屏幕或其他設備上表示時,轉換為八 進制/十六進制數,可縮短長度。
八進制:Octal (用后綴“O”表示)
十六進制:Hexadecimal (用后綴“H”,或前綴“0x”表示)
例:1010 1100 0100 0101 0001 0000 1000 1101B可寫成
0xac45108d 0xAC45108D 或 ac45108dH AC45108DH 或 8進制:25421210215O
010 101 100 010 001 010 001 000 010 001 101
現代計算機系統多用十六進制表示機器數
進制數之間的轉換

十進制數與二進制數之間的轉換

簡便方法:835=512+256+64+2+1,故結果為 11 0100 0011 0.6875=0.5+0.125+0.0625,故結果為 0.1011 結果為 11 0100 0011.1011
十進制數與8進制數之間的轉換

定點數和浮點數
計算機中只有0和1,數值數據中的小數點怎么表示呢? – 計算機中只能通過約定小數點的位置來表示 • 小數點位置約定在固定位置的數稱為定點數 • 小數點位置約定為可浮動的數稱為浮點數 • 定點小數用來表示浮點數的尾數部分 • 定點整數用來表示整數,分帶符號整數和無符號整數 • 任何實數:X=(-1)s ×M×RE 其中,S取值為0或1,用來決定數X的符號;M是一個二進制定點小數,稱為數X的尾數(mantissa);E是一個二進制定點整數,稱為數X的階或指數(exponent);R是基數(radix、base),
可以為2、4和16等。 計算機中只要表示S、M和E三個信息,就能確定X的值,這稱為浮點數
定點數的編碼表示
原碼(Sign and Magnitude)表示

“正”號用0表示
“負”號用1表示
數值部分不變!
補碼 - 模運算(modular運算)
重要概念:在一個模運算系統中,一個數與它除以“模”后的余數等價.
時鍾是一種模12系統 現實世界中的模運算系統
假定鍾表時針指向10點,要將它撥向6點, 則有兩種撥法:
① 倒撥4格:10- 4 = 6
② 順撥8格:10+8 = 18 ≡ 6 (mod 12)
模12系統中: 10- 4 ≡ 10+8 (mod 12) - 4 ≡ 8 (mod 12)
則,稱8是- 4對模12的補碼 (即:- 4的模12補碼等於8)。
同樣有 -3 ≡ 9 (mod 12) -5 ≡ 7 (mod 12)等
結論1: 一個負數的補碼等於模減該負數的絕對值。
結論2: 對於某一確定的模,某數減去小於模的另一數,總可 以用該數加上另一數負數的補碼來代替。
補碼(modular運算):+ 和– 的統一 .
補碼(2’s comlement)的表示

計算機中的運算器是模運算系統

結論:一個負數的補碼等於將對應正數補碼 各位取反、末位加一
變形補碼(4’s comlement)的表示

求真值的補碼

求補碼的真值

移碼表示Excess (biased) notion

C語言中的整數
C語言支持的基本數據類型

整數類型分:無符號整數和帶符號整數
無符號整數 (Unsigned integer)

帶符號整數(Signed integer)

C語言程序中的整數
無符號數:unsigned int ( short / long);帶符號整數: int ( short / long)
常在一個數的后面加一個“u”或“U”表示無符號數
若同時有無符號和帶符號整數,則C編譯器將帶符號整數強制轉換為無符號數
假定以下關系表達式在32位用補碼表示的機器上執行

例子:
例如,考慮以下C代碼: 1 int x = –1; 2 unsigned u = 2147483648; 3 4 printf ( “x = %u = %d\n”, x, x); 5 printf ( “u = %u = %d\n”, u, u); 在32位機器上運行上述代碼時,它的輸出結果是什么?為什么? x = 4294967295 = –1 u = 2147483648 = –2147483648 因為–1的補碼整數表示為“11…1”,作為32位無符號數解釋 時,其值為2的32–1= 4 294 967 296–1 = 4 294 967 295。 231的無符號數表示為“100…0”,被解釋為32位帶符號整數 時,其值為最小負數:–2的32-1 = –231 = –2 147 483 648。
編譯器處理常量時默認的類型

浮點數的編碼表示
科學計數法(Scientific Notation)與浮點數

浮點數(Floating Point)

浮點數的表示

IEEE 754 標准

機器數轉換為真值

真值轉換為機器數

規格化數
0的機器數表示

+∞/-∞的機器數表示

“非數”的表示

非數值數據的編碼表示
西文字符的編碼表示
特點 –是一種拼音文字,用有限幾個字母可拼寫出所有單詞 –只需對有限個字母和數學符號、標點符號等輔助字符編碼 –所有字符總數不超過256個,使用7或8個二進位可表示 • 表示(常用編碼為7位ASCII碼) –十進制數字:0/1/2…/9 –英文字母:A/B/…/Z/a/b/…/z –專用符號:+/-/%/*/&/…… –控制字符(不可打印或顯示) • 操作 –字符串操作,如:傳送/比較 等

至少需2個字節才能表示一個漢字內碼。為什么? –由漢字的總數(超過6萬字)決定! • 可在GB2312國標碼的基礎上產生漢字內碼 –為與ASCII碼區別,將國標碼的兩個字節的第一位置“1”后 得到一種漢字內碼(可以有不同的編碼方案) 例:漢字“大”在碼表中位於第20行、第83列。因此區位碼為 0010100 1010011,在區、位碼上各加32得到兩個字節編碼,即 00110100 01110011B=3473H。前面的34H和字符“4”的ACSII碼相同,后面的73H和字符“s”的ACSII碼相同,
但是,將每個字節的最高位各設為“1”后,就得到其內碼:B4F3H (1011010011110011B),因而不會和ASCII碼混淆。
數據寬度和存儲容量的單位
- 比特(bit,位)是計算機中處理、存儲、傳輸信息的最小單位
- 二進制信息最基本的計量單位是“字節”(Byte) –現代計算機中,存儲器按字節編址
- 字節是最小可尋址單位 (addressable unit )
- 如果以字節為一個排列單位,則LSB表示最低有效字節,MSB 表示最高有效字節
- • 除比特(位)和字節外,還經常使用“字”(word) 作為單位
- “字”和 “字長”的概念不同 IA-32中的“字”有多少位? 字長多少位呢?
- DWORD :32位
- QWORD:64位
字和字節
- “字”和 “字長”的概念不同 –“字長”指數據通路的寬度。
- ”字長”等於CPU內部總線的寬度、運算器的位數、通用 寄存器的寬度(這些部件的寬度都是一樣的)
- –“字”表示被處理信息的單位,用來度量數據類型的寬度
- –字和字長的寬度可以一樣,也可不同
- 例1:對於x86體系結構,不管字長多少,定義“字”的寬 度都為16位,而從386開始字長就是32位了。
- 例2:對於MIPS 32體系結構,其字和字長都是32位。
數據量的度量單位
存儲二進制信息時的度量單位要比字節或字大得多 容量經常使用的單位有: – “千字節”(KB),1KB=210字節=1024B – “兆字節”(MB),1MB=220字節=1024KB – “千兆字節”(GB),1GB=230字節=1024MB – “兆兆字節”(TB),1TB=240字節=1024GB • 通信中的帶寬使用的單位有: – “千比特/秒”(kb/s),1kbps=103 b/s=1000 bps
– “兆比特/秒”(Mb/s),1Mbps=106 b/s =1000 kbps
– “千兆比特/秒”(Gb/s),1Gbps=109 b/s =1000 Mbps
– “兆兆比特/秒”(Tb/s),1Tbps=1012 b/s =1000 Gbps 如果把b換成B,則表示字節而不是比特(位) 例如,10MBps表示 10兆字節/秒
程序中數據類型的寬度

數據存儲時的字節排列
數據的存儲和排列順序


大端/小端方式舉例

以下是一個由反匯編器生成的一行針對IA-32處理器的機器 級代碼表示文本: 80483d2: 89 85 a0 fe ff ff mov %eax, 0xfffffea0(%ebp) 其中,80483d2是十六進制表示的指令地址 89 85 a0 fe ff ff 是機器指令 mov %eax, 0xfffffea0(%ebp) 是對應的匯編指令 0xfffffea0是立即數 請問:立即數0xfffffea0的值和所存放地址分別是多少? IA-32是大端還是小端方式? 立即數0xfffffea0所存放的地址為0x80483d4; 立即數0xfffffea0的值為-10110000B=-176; IA-32采用的是小端方式!
錯題集

正確答案:B你錯選為A 解析: B、-8196=-(8192+4)=-10 0000 0000 0100B,因此,si和usi的機器數都為1101 1111 1111 1100,按無符號整數解釋,其值為65535-3-8192=65535-8195=57340。

正確答案:D你錯選為C 解析: D、-32768=-1000 0000 0000 0000B,因此,si和usi的機器數都為1000 0000 0000 0000,按無符號整數解釋,其值為32768。

正確答案:D你錯選為B 解析: D、65535=1111 1111 1111 1111B,因此,usi和si的機器數都為1111 1111 1111 1111,按帶符號整數解釋,其值為-1。

正確答案:C你錯選為B 解析: A、2147483647的機器數為011┅1,在C90中為int型;2147483648的機器數為100┅0,在C90中為unsigned型,強制類型轉換為int后,按帶符號整數比較,顯然011┅1比100┅0大,即結果為“假”。
B、2147483647的機器數為011┅1,在C90中為int型;2147483648的機器數為100┅0,在C90中為unsigned型,
-2147483648的機器數通過對100┅0各位取反末位加一得到,因此,機器數還是100┅0。011┅1和100┅0按無符號整數比較,顯然011┅1比100┅0小,即結果為“假”。
C、-1的機器數為全1,-2的機器數為11┅10,按無符號整數比較,顯然全1比任何數大,即結果為“真”。
D、-1的機器數為全1,按無符號整數比較,全1是最大的數,顯然比0大,即結果為“假”。
