一.位
為什麼是二進位制:計算機是由僅具有開關兩個狀態的邏輯電路組成
二進位制的計算模式被十進位制簡單
具有較強抗干擾性
二進位制便於布林代數運算
二進位制:使用乙個選中的數r作為底,並用它的冪作為權,這樣就形成了用r來表示所有數的形式
二進位制就是以2為底,2的冪次來表示的形式
進製轉換:十進位制轉換二進位制
每個數除以二,得餘數倒序
也可以通過2的冪次拼接
十六進製制;從0到f,c語言中,使用0x********來標識十六進製制數
char字元型:1個位元組
short:短整型:2個位元組
int整型:4個位元組
long長整型:4個位元組
long long長長整型:8個位元組
float:單精度浮點型:4個位元組
double:雙精度浮點型:8個位元組
指標:4個位元組:32位
位級操作:
布林代數:與或非
異或:不同為1,相同為0
c語言中有所有位運算操作符:&,|,~,^使用與所有整形資料long int short char unsigned
將引數視為位向量
引數是按位來參與運算
邏輯運算:&&,||,!定義0為假,所有非0值為真,返回值非0即1
移位運算:左移x右移x>>y
將位向量x右移y位,右邊多餘位均捨棄
邏輯右移:左邊以0補齊
算術右移:左側用最高位補齊
左移k位就是乘以2^k
右移k位就是除以2^k,但有可能越界了,就截斷
基於位元組的記憶體模式
:已知一條位址匯流排的位數,如何計算其所能表達的位址空間大小
例如:一條位址匯流排有13根位址線,則它表達的位址空間有2^13
乙個記憶體位址存放的是乙個位元組
位址指明的是某個位元組的存放位置
即某資料第乙個位元組所在的位置
因此連續存放的兩個字之間相差4個位址(32位字長)或者8個位址(64位字長)
位元組的存放順序
乙個多位元組資料怎樣在記憶體中存放的
小端法:低位位元組佔據低位位址
舉例:4位元組變數x的值是0x01234567,
0x100 0x101 0x102 0x103
67 45 23 01
指標表示:類似,比如0xbffff0e8也是用小端法儲存
字串表示:無小端法與大端法區別,因為這是字元陣列,每乙個字元只佔乙個位元組
由字元的陣列表示每乙個字元由ascii碼來表示
字元』0』的ascii碼為0x30,數i的ascii碼為0x30+i
字串必須以乙個空字元表示結尾,也就是說最後乙個字元為0
二.整數
1.有符號數與無符號數
c資料型別 最小值 最大值
char -128 127(因為我們只能用這8位表示正數和負數,所以我們只能用一半的數來表示負數,剩下的一半表示非負數,因為中間有個0,是非負數)
unsigned char 0 255 (因為char只佔乙個位元組,有8位,所以可以表示2^8-1=255)
short -32768 32767
unsigned short 0 65535(2^16-1)
整數的編碼:
無符號數:b2u(x)=
b:binary u:unsigned意思就是二進位制轉換為10進製的unsigned
有符號數就用二進位制補碼來表示:
如果是有符號數轉換為10進製就要加上符號位的負權重
(有符號數)二進位制補碼中,最高位為符號位
0表示非負數,1表示負數
補碼的本質:b2t(x)=
用最高位的負權重將數值往數軸負方向遷移
將無符號數中最高位為1的一半用來表示負數
1000如果是無符號數為+8,如果是有符號數,這就是二進位制補碼,為-8,在取值16的範圍內,+8和-8形成了互補
也就是將無符號數2(w-1)到2w-1這一段範圍來表示負數-2^(w-1)到-1
2(w-1)到2w-1最高位就為1了,用來表示負數
1010原本表示為無符號數就是23+21=10
如果表示為有符號數就是負數,為-23+21=-6
這兩個在16的範圍內就是互補,所以1010就是-6的補碼表示(也就是有符號數)
補碼的取值範圍:也就是有符號數的取值範圍
-2(w-1)到2(w-1)-1
0到2(w-1)-1對應於無符號數的0到2(w-1)-1
-2(w-1)到0對應於無符號數的2(w-1)到2^w-1
當w=16時
無符號數最大值ff ff 也就是11111111 11111111
二進位制補碼也就是有符號數最大值就是01111111 11111111也就是7f ff
|tmin|=tmax+1
umax=2*tmax+1
在c語言中
ulong_max=2^32-1(表示無符號的長整型的最大值)
long_max=2^(32-1)-1
long_min=-2^(32-1)
求補碼的四種方式
對字長為w的負數x求補碼(也就是有符號數的二進位制表示)
-6表示為1010
方法2^w-|x|=a,則a(無符號數)的二進位制表達即為x的w位補碼
-6的原碼為1110,首位符號位不變,餘下三位取反加1得1010
轉換:有符號數與無符號數的表示
有符號數-6變為t2b
t:有符號數 b:binary
就是將有符號數變成補碼表示
然後將補碼表示當做無符號數底權公式展開
有符號數負數部分+2^w就是其對應的無符號數
c語言中的整數:
常數:預設為有符號數
或者使用u作為無符號數的字尾
有符號數和無符號數的轉換與u2t以及t2u完全一樣
特殊情況:如果乙個表示式中既有無符號數,又有有符號數,有符號數直接轉為無符號數
在32位機器中,int有32位
int x=-1 這是有符號數(用二進位制補碼表示),為32個1
轉化為有符號數就是2^32-1=4294967295
unsigned u=2147483648=2^31轉化為二進位制就是1+31個0
轉化為有符號數為-2^31=-2147483648
有符號數小結:
位模式不變,本質是用最高位為1的數去表示有互補關係的負數
重新解釋
當加上或者減去2^w時會有意外情況
表示式中同時存在有符號數和無符號數時,int 預設轉換為unsigned
深入理解計算機系統 第二章
1 什麼是規格化的值?當exp的位模式既不全為0,也不全為1,這種情況下,階碼字段被解釋為以偏置形式表示的有符號整數,也就是說,階碼的值是e e bias,其中e是無符號數,其位表示為,而bias就是乙個等於2k 1 1的 偏置值。2 什麼是非規格化的值?當階碼域全為0時,所表示的就是非規格化的形式...
計算機系統第二章 浮點數
二進位制小數 底權公式 1011.101 8 2 1 0.5 0.125 11.625 竅門 小數部分寫成分數,分母為2 k,k為小數字數,分子為小數部分二進位制的值,即101 5 8 0.625 觀察 小數點右移一位 乘2 小數點左移一位 除2 二進位制小數表示範圍 只能精確表示諸如x 2 k的數...
《深入理解計算機系統》第二章部分習題
人生第一篇博文。深入理解計算機系統 第二章部分習題 2.62 int shifts are arithmetic 對int型別數使用算術右移返回1,否則返回0 顯然,只需考慮負數即可 非負數算術右移與邏輯右移相同 這裡以 1為例,1算術右移一位,所產生的二進位製碼代表的數值不變 而邏輯右移則會使最高...