資訊的表示和處理

      本渣渣要進行CSAPP期中考了,但是上半學期啥也沒聽QWQ,只能臨陣磨槍了

*學習要點*

1、計算機如何表示數字

2、其他形式資料的基本屬性

*資訊儲存*

位元組:最小的可定址的記憶體單位

地址:記憶體中每個位元組都由一個唯一的數字來標識

虛擬地址空間:所有可能地址的集合

字長:指明指標資料的標稱大小(對於一個字長為w的機器而言,虛擬地址的範圍為0~pow(2,w)-1,程式最多訪問pow(2,w)個位元組)

C語言資料型別對應位元組數(32位/64位)

char/unsigned char         1/1

short/unsigned short       2/2

int/unsigned                   4/4

long/unsined long          4/8

int32_t/uint32_t              4/4

int64_t/uint64_t              8/8

char*                              4/8

float                               4/4

double                            8/8

排列表示一個物件的位元組有兩種方式:

  1. 小端法(最低有效位元組在前面)
  2. 大端法

表示字串:

C語言中字串被編碼為一個以NULL字元結尾的字元陣列。某個字元都由某個編碼標準來表示,最常見的是ASCII字元碼。

布林代數簡介

二進位制值是計算機編碼、儲存和操作資訊的核心

&     與

|       或

~     非

^     異或

C語言支援按位進行布林運算

掩碼運算:

掩碼:一個位模式,表示從一個字中選出的位的集合(掩碼是一串二進位制程式碼對目標字串進行按位與運算,遮蔽當前的輸入位

掩碼0xFF表示一個字的低位位元組(eg :  x&0xFF生成一個由x的最低有效位元組組成的值

~0生成一個全為1的掩碼

C語言中邏輯運算:

所有非零引數都為TRUE,引數零表示FALSE

1表示TRUE,0表示FALSE

C語言中移位運算:

左移:x<<k表示x向左移動k位,丟棄最高的k位,並在右端補k個0

右移:x>>k

  1. 邏輯右移:在左端補k個0
  2. 算數右移:在左端補k個最高有效位的值

幾乎所有的計算機/編譯器都對有符號數使用算數右移,同時,對於無符號數,邏輯右移是必須的

*無符號數編碼的定義

*補碼編碼的定義

有符號和無符號之間的型別轉換

對於大多數C語言的實現,處理同樣字長的有符號數和無符號數之間相互轉換的一般規則是:數值可能會改變,但是位模式不變

U2Bw(x):在0<=x<=UMAXw時,給出x的唯一的w位無符號表示

T2Bw(x) :在TMINw<=x<=TMAXw時,給出x的唯一的w位無符號表示

補碼轉化為無符號數

對滿足TMINw<=x<=TMAXw的x有:

                            T2Uw(x) = x+pow(2,w),     x<0

                                            x,                               x>=0

無符號數轉化為補碼:

對滿足0<=u<=UMAXw的u有:

                           U2Tw(u) = u,                              u<=TMAXw

                                            u-pow(2,w),               u>TMAXw

擴充套件一個數字的位表示

零擴充套件:將一個無符號數轉換為一個更大的資料型別時在前面添0

符號擴充套件:新增最高有效位的值1

(剩下的符號太多了,不打了。。。。。。。。)