1. 程式人生 > >CSAPP:資訊的表和處理1

CSAPP:資訊的表和處理1

CSAPP:資訊的表和處理1

關鍵點:定址、記憶體、磁碟、虛擬地址、實體地址、整型陣列。

資訊儲存中的幾個概念整型資料型別無符號數有符號數幾個概念有符號數與無符號數之間轉換基於棧與基於暫存器的區別

資訊儲存中的幾個概念

記憶體
  記憶體也被稱為記憶體儲器,其作用是用於暫時存放CPU中運算的資料,計算機中的所有程式都在記憶體中執行。包括只讀儲存器(ROM:快閃記憶體、磁碟)、隨機儲存器(DRAM:動態隨機儲存器、SRAM:靜態隨機儲存器)和高速緩衝儲存器(cache)。

  • 實體記憶體
      真實的硬體裝置(記憶體條)
  • 虛擬記憶體
      作業系統給應用程式製造了一個假象,讓每個應用程式認為自己獨享4G(假設32位cpu),這個4G是一個虛擬地址空間。作業系統復負責記憶體管理,完成實體記憶體與虛擬記憶體之間的對映

地址
  如果把記憶體比作一個個小房間,那麼地址就是每個房間的編號。地址匯流排決定定址範圍,32位CPU定址範圍位0x00000000~0xFFFFFFFF(4G)

定址和位元組順序

  • 小端模式(little endian):低地址存放低位元組,高地址存放高位元組。大多數Intel都是小端模式
1int x = 0x01234567;
2char *p =(char *)&x;
3printf("%d\r\n",*p);
4*p = 0x67;
5*(p+1) = 0x45;
6*(p+2) = 0x23
;
7*(p+3) = 0x01;
  • 大端模式(big endian):低地址存放高位元組,高地址存放低位元組。
1int x = 0x01234567;
2char *p =(char *)&x;
3printf("%d\r\n",*p);
4*p = 0x01;
5*(p+1) = 0x23;
6*(p+2) = 0x45;
7*(p+3) = 0x67;
  • 位元組順序:大小端模式可能造成的問題
  1. 網路位元組序
  2. 強制型別轉換或者聯合(union)需要注意。

整型資料型別

無符號數

  假設一個整數資料型別有w位。則其資料範圍位為0~。32位平臺下long = int ,64位平臺下long站8位。

32位平臺

 

資料型別 位數 最小值 最大值
unsigned char 8 0 255
unsigned short 16 0 65535
unsigned int 32 0 4294967295
unsigned long 32 0 4294967295
uint32_t 32 0 4294967295
uint64_t 64 0 18446744073709551615

 

64位平臺

 

資料型別 位數 最小值 最大值
unsigned char 8 0 255
unsigned short 16 0 65535
unsigned int 32 0 4294967295
unsigned long 64 0 18446744073709551615
uint32_t 32 0 4294967295
uint64_t 64 0 18446744073709551615

有符號數

  假設一個整數資料型別有w位。則其資料範圍位為~.有符號數+無符號數 =

32位平臺

 

資料型別 位數 最小值 最大值
char 8 -128 127
short 16 -32768 32767
int 32 -2147483648 2147483647
long 32 -2147483648 2147483647
int32_t 32 -2147483648 -2147483647
int64_t 64 -9223372036854775808 9223372036854775808

 

64位平臺

 

資料型別 位數 最小值 最大值
char 8 -128 127
short 16 -32768 32767
int 32 -2147483648 2147483647
long 64 -9223372036854775808 9223372036854775808
int32_t 32 -2147483648 2147483647
int64_t 64 -9223372036854775808 9223372036854775808

幾個概念

  數值在計算機中都是以補碼形式存在的。

  • 原碼:符號位加上真值的絕對值。即第一位表示符號位,其餘位表示值
  • 反碼:正數反碼等於其原碼(本身),負數反碼在其原碼基礎上,符號位不變,其餘各位取反。
  • 補碼:整數補碼等於本身,負數 = 反碼 + 1。
數值 原碼 反碼 補碼
85 01010101 01010101 01010101
-85 11010101 10101010 10101011

有符號數與無符號數之間轉換

  實際上是無符號數與補碼之間的轉換。-85 = 10101011 = 171U。一個w位的有符號數,假設其值位X(負數),其對應的無符號值為Y,則有:

基於棧與基於暫存器的區別

  • 可移植性:基於暫存器的CPU架構,依賴於平臺,暫存器指令不同。
  • 不用考慮暫存器分配問題:基於棧的架構,不用考慮暫存器