二進制:數組
逢二進位 ( 0 1 )函數
在c代碼裏的二進制數以0b開頭:學習
0b1001 0b1111 0b11111001指針
0b111111111111111111111111內存
十六進制:數學
逢十六進位( 0 1 2 3 4 5 6 7 8 9 a b c d e f ) 在c代碼裏以0x開頭表達16進制數基礎
0x1 0x1111 0xabcd 0x12ab 變量
0xffaabbccddee11234456789數據類型
八進制:二進制
逢八進位 (0 1 2 3 4 5 6 7)
在c代碼裏以0開頭來表達八進制數
012 01234567
07654321
十進制: 1234 = 4*1 + 3*10 + 2*100 + 1*1000
=4*10^0 + 3*10^1 + 2*10^2 + 1*10^3
= 1234
1234 %10 4 * 10^0
除10 123 %10 3 * 10^1
除10 12 %10 2 * 10^2
除10 1 %10 1 * 10^3
十進制轉二進制:
1234 -> 二進制
1234
/2 617 餘 0 * 2^0
/2 308 餘 1 * 2^1
/2 154 餘 0 * 2^2
/2 77 餘 0 ...
/2 38 餘 1
/2 19 餘 0
/2 9 餘 1
/2 4 餘 1
/2 2 餘 0
/2 1 餘 0
/2 0 餘 1
1234 ->0b10011010010
十進制轉十六進制:
1234 -> 十六進制
1234
/16 77 餘 2
/16 4 餘 13 ->d
/16 0 餘 4
1234 -> 0x4d2
十進制轉八進制:
1234 -> 八進制
1234
/8 154 餘 2
/8 19 餘 2
/8 2 餘 3
/8 0 餘 2
1234 -> 02322
總結:十進制轉n進制的方法:
不斷的除n,除到商爲0止,餘數倒序便可
二進制轉十進制:
0b11011001
1 1 0 1 1 0 0 1
冪 7 6 5 4 3 2 1 0
1*2^0+0*2^1 + 0*2^2 + 1*2^3+1*2^4+0*2^5+1*2^6+ 1*2^7 = 1+8 +16 +64+ 128 = 217
十六進制轉十進制:
0x123
1 2 3
冪 2 1 0
3*16^0 + 2*16^1 + 1*16^2 =3+32+256=291
八進制轉十進制:
0123
1 2 3
冪 2 1 0
3*8^0+2*8^1+1*8^2 = 3+16+64=83
二進制轉十六進制:(8421規則)
0b1101110010101
-> 0001 1011 1001 0101
冪 3210 3210 3210 3210
8421 8421 8421 8421
1 11 9 5
1 b 9 5
-> 0x1b95
十六進制轉二進制:(每一個十六進制位變成4個二進制位)
0xabcd1234
a b c d 1 2 3 4
0b 1010 1011 1100 1101 0001 0010 0011 0100
0b10101011110011010001001000110100
二進制轉八進制:(421規則)
0b11010010010101
011 010 010 010 101
冪 210 210 210 210 210
421 421 421 421 421
-> 3 2 2 2 5
-> 032225
八進制轉二進制:(每一個八進制位變成3個二進制位)
01234
1 2 3 4
-> 001 010 011 100
-> 0b 1 010 011 100
-> 0b1010011100
二進制的加法:
0b 1 1 0 1 0 1 1 1
+ 0b 0 1 1 0 1 0 1 0
--------------------------
0b 1 0 1 0 0 0 0 0 1
八進制的加法:
0 1 2 3 4
0 7 6 5 3
-----------------
1 1 1 0 7
**********************************
原碼 反碼 補碼
概念:
機器數: 11011010
機器數就是一種內存狀態,即一種二進制狀態,不能
讀成咱們數學意義上的數值
真值: 有一個機器數11011010
有符號的真值的表達方式:
最高位的概念:
若是是1字節的數據,
第7位就是最高位
若是是2字節的數據
第15位就是最高位
若是是4字節的數據
第31位就是最高位
若是是8字節的數據
第63位就是最高位
最高位表明符號位
最高位爲1表明負數
最高位爲0表明正數
10011000 有符號表達一個真值:-24
無符號的真值的表達方式:
直接將機器數當作二進制數轉成十進制便可
例:
10011000 -> 128+24= 152
原碼:
正數的原碼 就是將它轉成二進制數便可,
本質是(機器數,是一種二進制狀態)
負數的原碼: 最高位爲符號位 剩下的位表明數值
例:
1字節的數-25 的原碼(的機器數):10011001
1字節的數25 的原碼(的機器數): 00011001
2字節的數-25 的原碼(........):
1000000000011001
2字節的數25 的原碼:
0000000000011001
反碼: 正數的反碼等於原碼
負數的反碼是在原碼的基礎上,符號位不變,其他
位取反
1字節的數-25 的反碼:
(原)10011001 -> (反)11100110
1字節的數25 的反碼:
(原)00011001 -> (反)00011001
2字節的數-25 的反碼:
(原)1000000000011001
->(反)1111111111100110
補碼:
正數的補碼等於原碼
負數的補碼是在原碼的基礎上,符號位不變,其他
位取反後+1
1字節的數-25 的補碼:
(原)10011001
-> (反)11100110
-> (補)11100111
2字節的數-25 的補碼:
(原)1000000000011001
->(反)1111111111100110
->(補)1111111111100111
爲何要學習補碼:
假設拿原碼作加法運算:
25 00011001
+ -24 10011000
-----------------------
10110001 = -49
用原碼參加運算會發生錯誤
因此用補碼試試:
25 00011001
- 4 11111100
-------------------
00010101
*************************************
數據類型 變量 內存
char c=-114;
unsigned char uc=142;
上邊這兩個變量的內存狀態徹底同樣
數據類型的概念:
是一種規則,這種規則可以知道訪問內存時須要
訪問幾個字節, 同時也能知道將內存裏的狀態以
什麼樣的表達方式表達出來
變量的概念:
參照一種規則(數據類型),對某一個內存地址打上
一個標籤,劃定一個大小,有這種變量以後,程序
處理數據時就能夠經過變量名來訪問內存
數據類型分類:
標量類型: 整型 浮點型, 指針,
聚合類型: 數組和結構體
學習某種數據類型時:
討論該數據類型的變量的三個屬性:
值, 地址, 內存大小
數組類型:
元素, 地址, 內存大小
結構體:
成員 地址 內存大小
整型變量:
有符號 無符號
1 字節 char unsigned char
2 字節 short (int) unsigned short
4 字節 int unsigned int
8 字節 long unsigned long
8 字節 long long unsigned long long
printf這個函數的格式控制:
int a;
printf(" %d ", a); 以有符號整型輸出4個字節
printf(" %p ", &a); 以16進制輸出8個字節
long l;
printf(" %ld ",l ); 以有符號整型輸出8個字節
unsigned long ul;
printf(" %lu ",ul); 以無符號整型輸出8個字節
char c;
printf(" %d ",c); 將單字節整型以有符號整型4字節輸出
printf(" %c ",c); 將單字節整型以字符形式輸出
printf(" %x ",a); 以16進制輸出4個字節
討論一下各類長度的整型變量的取值範圍
char [-128, 127]
unsigned char [0 , 255]
short int [-2^15 ,2^15-1]
unsigned short [0 , 2^16-1]
int [-2^31, 2^31-1]
unsigned int [0, 2^32-1]
long [-2^63, 2^63-1]
unsigned long [0, 2^64-1]
浮點型變量:
float 4個字節
精確到小數點後6位
printf("%f",f); %f輸出6位小數
double 8個字節
精確到小數點後12位
printf("%1.12f",f); %1.12f輸
出12位小數,1位整數
數據類型之間隱式轉換的原則:
相同數據類型之間:只能從小內存往大內存轉
整型與浮點型之間:整型能夠轉浮點型
但浮點不能轉整型