數據的表示和存儲


數制與編碼

“轉換”的概念在數據表示中的反映

信息的二進制編碼

  • 機器級數據分兩大類
    •   數值數據:無符號整數、帶符號整數、浮點數(實數)
    •   非數值數據:邏輯數(包括位串)、西文字符和漢字
  • 計算機內部所有信息都用二進制(即: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的補碼整數表示為“111”,作為32位無符號數解釋
時,其值為2的32–1= 4 294 967 2961 = 4 294 967 295。
 231的無符號數表示為“1000”,被解釋為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┅0011┅1和100┅0按無符號整數比較,顯然011┅1比100┅0小,即結果為“假”。
C、-1的機器數為全1,-2的機器數為11┅10,按無符號整數比較,顯然全1比任何數大,即結果為“真”。
D、-1的機器數為全1,按無符號整數比較,全1是最大的數,顯然比0大,即結果為“假”。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM