Reg爲寄存器設計
字長,是說這個寄存器是多少寬的,每一個寄存器能夠表示32bit數據,也是說CPU與RAM每一次傳遞的數據也是32bit3d
計算機內部一切都是二進制code
全部的類型,只是說咱們以什麼方式去看待它,並非代表,它在內部是怎麼 表達的。blog
18 -> 00010010內存
-18 -> ?編譯器
咱們在作十進制運算時,咱們實際上老是把負號先拋掉,把它當作一個整數作運算,在運算的結果上再解決負號問題。it
例如:12+(-18)-> 12-18 -> -6io
12 * -18 -> -(12 * 18)編譯
第一種方法須要在計算時須要添加符號來控制符號,不利於計算機內部的設計class
第二種方法在使用時須要與中間數進行運算來判斷當前數的具體數值
兩種方法都使得計算機的輸入輸出變得複雜。
實際計算機中使用的是補碼來表示負數
補碼思想:
256是2^8就是256((1)00000000),2^8-1就是-1的補碼
補碼的意義就是拿補碼和原碼能夠加出一個溢出的「零」
這樣能夠直接作普通的二進制運算,不須要進行+-符號的變換
高位爲0,表示1-127
高位爲1,表示-1 - -128
#include <stdio.h> int main() { char c = 255; int i = 255; printf("c=%d,i=%d\n",c,i); // 對於char c 來講爲11111111最高位爲1是負數 //對於int(32bit) i來講爲00000000 00000000 00000000 11111111 return 0; }
int的範圍
-2^32-1^ ~ 2^32-1^-1
char 表達的是-128 ~ 127(中間有0)
全部整數類型範圍,在是2^n-1^ ~ 2^n-1^-1
若是想將11111111當作一個純二進制的來看須要unsigned來表達
unsigned的意思是這個整數不以補碼的形式表示,沒有負數,使得正數的表達範圍被擴大。
00000000-11111111 unsigned表示0-255,原來是-128~127
第二個01111111是127,加1 後原本是128,但128做爲一個整數char來講,它所表達的是-128
將數的範圍想象成一個圓
對一個unsigned char來講,127+1就等於128,若是是255,+1才變成0
因此對於unsigned char來講,另外一個圓
使用數的範圍能夠找出int的最大數來,這也是翁凱老師留的一個小測驗。
主要思想仍是不斷累加(while循環),當最後累加的數小於0時,用這個數再減1就等到int能表示的最大值
全部小於int的,char、short、int都採用相同的輸出就是用%d;全部比int大的,須要用%ld
#include <stdio.h> int main() { char c = -1; int i = -1; printf("c=%u,i=%u\n",c,i); return 0; }
上面結果同樣都是4294967295(-1表示全1),這個數是unsigned int所能表達的最大的數,char正常-1只有一個字節,只有最低位爲1,當咱們把小於int的變量傳給printf時,編譯器會把變量轉換爲int傳進去,由於是有符號的,會被擴展爲全部位都是1,最後做爲unsigned結果就是如今這個結果。
#include <stdio.h> int main() { char c = 012; int i = 0x12; printf("c=%d,i=%d\n",c,i); //%o是8進制,%x是16進制 return 0; } //輸出結果爲c=10,i=18
%d是想讓它以十進制的方式輸出。
八進制,1x8+2x1=10;十六進制,1x16+2x1=18
進制只是咱們怎麼去看它,並不表明在計算機內部它會表示成八進制或十六進制,
計算機內部永遠只有二進制,你在程序中寫個八進制,編譯器會替你轉成對應的十進制形式去變成二進制交給計算機
小總結:
0001 (1) 00010(2)前四個bit表達爲1,後四個爲2,12就能夠表達前面的二進制數,16進制的兩位正好表達一個char(1個字節)
CPU每次從內存中讀一次數據,每一次向其中寫一次數據,就是一個int,若是你讓它作一個char,實際上它作的就是把32 bit的數據所有讀進來,而後從當中拿出那8 bit給你。