【彙編】01_數值運算

一、整數

預備知識

1K  = 210      = 1024 (Kilo)編碼

1M = 1024K = 220(Mega)spa

1G = 1024M = 230(Giga)設計

1T = 1024G = 240(Tera)3d

1P = 1024T = 250(Peta)orm

 

1個二進制位:bit        (比特)blog

8個二進制位:Byte    (字節)       1Byte = 8Bit內存

2個字節:     Word    (字)         1Word = 2Byte = 16bitci

 

1.1 數制

           數    制           基 數 數    碼

二進制     Binaryit

八進制     Octalio

十進制     Decimal

十六進制  Hexadecimal

 

2

8

10

16

 

0,1

0,1,2,3,4,5,6,7

0,1,2,3,4,5,6,7,8,9

0,1,2,3,4,5,6,7,8,9

A,B,C,D,E,F

 

 

 

 

 

 

 

 

1.2 數制之間的轉換

二進制  十六進制                      相通

十進制  二進制                         十 到 二    降冪法(除法)

十進制  十六進制                     十 到 二     降冪法(除法)

 

十六進制:十六進一,借一當十六

 

1.3 邏輯運算(按位操做)

 

 例: X = 00FFH    Y = 5555H    Z = X ^ Y = ?

            X = 0000 0000 1111 1111 B

         ^ Y = 0101 0101 0101 0101 B


            Z = 0101 0101 1010 1010 B

因此 Z= 55AAH

 

附:位運算之左移和右移

左移只有一種——高位丟棄,低位補0

右移有兩種:一、邏輯右移——低位丟棄,高位補0

                 二、算術右移——低位丟棄,高位補充與最高位相同的值

 

1.4 數的機器表示(初步)

1.4.1 機器字長(machine word)

  • 定義:通常指計算機進行一次整數運算所能處理的二進制數據的位數
    • 一般也包括數據地址長度
  • 32位字長
    • 地址的表示空間是4GB
    • 對不少內存需求量大的應用而言,很是有限
  • 64位字長
    • 地址的表示空間約爲1.8 * 1019 bytes
    • 目前的x86-64機型實際支持48位寬的地址:256TB
  • 機器字在內存中的組織
    • 機器字中第一個字節的地址
    • 相鄰機器字的地址相差4(32bit)或者8(64bit)

            

 

1.4.2 字節序(Byte Ordering)

一個機器字內的各個字節如何排列?

  • Big Endian: Sun,PowerPC,Internet
    • 低位字節(Least significant byte,LSB)佔據高位
  • Little Endian:x86
    • 低對低,高對高(與LSB相反)

 

1.5 整數表示

 

 

 1.5.1 計算機中整數的二進制編碼方式(w表示字長)

負數的二進制表示:補碼+1

 

1.5.2 符號位(sign bit)

  • 對於補碼錶示,MSB(Most Significant Bit)表示整數的符號
    • 0 for nonnegative
    • 1 for negative
1.5.2.1 取值範圍

      unsigned                 tag

 

1.5.2.2 無符號數與帶符號數之間的轉換

 

 

1.5.2.3 C語言中的無符號數與帶符號數
  • 常數(Constants)
    • 默認是帶符號數
      • 若是有「U」做爲後綴則表示無符號數,如 0U,4297665U
  • 若是無符號數與帶符號數混合使用,則帶符號數默認轉換爲無符號數
    • 包括比較操做符

實例(w = 32)

即:

 

1.5.2.4 什麼時候採用無符號數
  • 模運算
  • 按位運算

建議:不能僅僅由於取值範圍是非負數而使用

 

1.5.2.5 無符號數加法

 

1.5.2.6 補碼加法

 

補碼加法的溢出

 

1.5.2.7 無符號整數除以2的k次冪

 

 

1.5.2.8 帶符號整數除以2的k次冪

 

 

2 浮點數

2.1 IEEE的浮點數標準

 

2.1.1 示例

侷限性:只能精確地表示X/2k這類形式的數據(k爲整數)

以上三個值二進制表示將會出現無限循環,如1/10的二進制表示小數部分出現0011的無限循環。

 

2.1.2 計算機中的浮點數二進制表示

 

2.1.2.1 C語言的單、雙精度

 

2.1.3 浮點數的類型

 

2.1.3.1 規格化浮點數(Normalized)

示例:

 

2.1.3.2 非規格化浮點數(denormalized)

 

2.1.3.3 一些特殊值

 

 

2.1.3.4 一種「小」浮點數實例

數軸上的分佈:

 2.1.3.5 一些特例

 

 2.1.3.6 浮點數的一些編碼特性

 

2.2 Rounding(舍入)

2.2.1 給定一個實數,如何給出其浮點數表示?

向偶數舍入(Round-to-Even)

這是計算機內默認的舍入方式,也稱爲「向最近值的舍入」;其餘方式會產生系統偏差。

關鍵的設計決策是肯定兩個可能結果的中間數值的舍入:

  •   確保舍入後的最低有效數字是偶數
  •   好比向百分位的舍入(十進制):
    • 1.2349999        1.23        (Less than half way)
    • 1.2350001        1.24        (Greater than half way)
    • 1.2350000        1.24        (half way -- round up)
    • 1.2450000        1.24        (half way -- round down)

對於二進制數而言:

  • 「Even」意味着最低有效數需爲0
  • 而最低有效數字右側的位串爲100...

 

一、規格化

二、舍入

三、調整(Postnormalize)

舍入可能致使溢出

 

2.3 C語言中的浮點數

 包括單精度浮點數(single point floating)和雙精度浮點數(double point floating)。

 C語言中int(32bit)、float(32bit)和double(64bit)三種數據類型之間的轉換規則:

  • int轉換成float,不會出現溢出現象,但可能會出現舍入(round-to-even)
  • int或float轉換成double,會保留int或float的全部精度
  • double轉換成float,可能出現溢出(+∞ or −∞
  • float或double轉換成int,會出現舍入至0(個位)

示例:

定義:int x; float f=...; double d=... (d和f都不是NaN)

 

本章參考書籍:《Computer Systems-A Programmer's Perspective(2nd Edition)》

相關文章
相關標籤/搜索