C語言 整數類型 整數類型 Reg為寄存器 字長,是說這個寄存器是多少寬的,每個寄存器可以表示32bit數據,也是說CPU與RAM每一次傳遞的數據也是32bit 電腦內部一切都是二進位 所有的類型,只是說我們以什麼方式去看待它,並不是表明,它在內部是怎麼 表達的。 整數的內部表達 18 00010 ...
C語言-整數類型
整數類型
Reg為寄存器
字長,是說這個寄存器是多少寬的,每個寄存器可以表示32bit數據,也是說CPU與RAM每一次傳遞的數據也是32bit
電腦內部一切都是二進位
所有的類型,只是說我們以什麼方式去看待它,並不是表明,它在內部是怎麼 表達的。
整數的內部表達
18 -> 00010010
-18 -> ?
我們在做十進位運算時,我們實際上總是把負號先拋掉,把它當做一個整數做運算,在運算的結果上再解決負號問題。
例如:12+(-18)-> 12-18 -> -6
12 * -18 -> -(12 * 18)
第一種方法需要在計算時需要添加符號來控制符號,不利於電腦內部的設計
第二種方法在使用時需要與中間數進行運算來判斷當前數的具體數值
兩種方法都使得電腦的輸入輸出變得複雜。
實際電腦中使用的是補碼來表示負數
補碼思想:
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結果就是現在這個結果。
八進位和十六進位
- 一個以0開始的數字字面量是8進位
- 一個以0x開始的數字字面量是16進位
#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給你。