一:資料類型
C語言的基本資料類型
int
short
float
double
char
long
1、什麼是資料類型 :在C語言中 資料類型是指用于聲明不同類型變量或者函數的一個廣泛系統, 決定資料範圍和含義的名額
變量的類型決定這個變量所占記憶體空間大小以及存儲方式!
2、資料類型是用來做什麼的: 資料類型就是為了定義變量而設計的!
3、C語言中的幾種資料類型(分為四種):
序号 類型 描述
1 、基本類型 就是算術類型 就是能夠參與運算的類型 包括了 整型和 浮點型
整型: int short long char 以上都可以使用 signed or unsigned 修飾
浮點型: float(單精度) double(雙精度)
2、 枚舉類型 其實也是一種算術類型 被用來定義在程式中隻能賦予一定離散值的資料變量
ex: 星期 隻能取 7個值 1 2 3 4 5 6 7 隻能取這七個值
3、 空類型 void類型即空值類型 表示這個變量沒有可以取的值 則用void定義變量毫無意義
ex: void v; 不對 v 沒有取值 是以無意義
- 派生資料類型 數組 指針 結構體 共用體 ...
4、資料 : 常量 和 變量
4.1 常量: 在程式的運作過程中其值不可以變的量稱之為常量
ex: 1 3 5.12 0x12 025 10e3 ....
ex: #define PI 3.14 PI 叫符号常量
什麼是符号常量:用一個符号來表示一個常量 這個符号叫做符号常量
如果執行 PI = 6.22 ; //對不對 不對 常量的值 不可以改變
4.1.1 整型常量:
表示方法不同有多種:3個2進制位表示 1個八進制
4個2進制位表示 1個十六進制位
二進制表示 僅由 01 組成 使用 B區分
八進制表示 僅由 0-7 組成 使用 O區分 以 0打頭
十進制表示 僅由 0 - 9 組成
十六進制表示 僅由 0 - F 組成 使用 0x打頭
注意:進制隻是數的表現形式 其與 數的大小和存儲沒有任何關系
5 05 0x5 大小沒有差別 都是 5
12 014 0x0C 這三個大小和存取都沒有差別 都表示 12
12 012 0x12 就不一樣了 12 10 18 大小不同
4.1.2 字元常量( 所有使用 '' 單引号引起來的若幹字元都是字元常量
字元在存儲形式上 是以ASCII碼的方式存儲的
ex: 'A' 'a' '0' '\n' '\0123'
注意:
0 == '\0'
0 == NULL // 0這個值表示的 字元是 NULL 與 '\0'
‘0’==48 //字元0的ASCII碼值是48
注意:
轉義字元( 為了差別含義上的不同有些相同的字元需要轉義
常見的轉義字元:
'\r' 回車
'\n' 換行
'\v' 垂直制表符
'\t' 水準制表符 相當于 tab
'\b' 倒退
'\\' \
'\'' '
'\"' "
......
4.1.3 浮點常量 有多種表示方式
1、十進制表示 0.12 0.56 0.125 1.56 ...
2、指數表示方式 即由十進制+階碼組成 中間使用e / E表示
ex: 2.5e6 =>2.5 *10^6
1.0E-2 => 1.0 *10^-2 = 0.01
一般遇到的常量就是以上的三種常量:
注意 整型常量類型 統一為 int
字元常量類型 可能是 char 也可能是int 這個根據不同運算确定 (後面詳細講解)
浮點常量類型 統一為double
4.1.4 常量的輸出列印 (對于輸出我們使用标準輸出輸出到終端or螢幕
整型常量 使用%d列印
字元常量 使用%c列印
浮點常量 使用%lf列印 // 浮點常量類型 統一為double
4.2 變量 (變量的使用 一定是先定義聲明 後使用
定義:在程式的運作過程中 值可以被改變的量叫做變量
***變量的實質:代表記憶體空間中具有特定屬性的一塊記憶體單元,用于存放一個資料到該記憶體單元中
這個存儲的資料叫做變量的值 這個值可以被更改!
***變量名:實質上就是為了區分不同的存儲單元 而設計的一個辨別
這個辨別符就是變量名,其辨別的是一塊存儲單元,使用 &變量名 來擷取位址
ex: int a = 10;
意思是 在記憶體空間中開辟一塊記憶體單元 這個記憶體單元的屬性是 int 存儲的值為10
a辨別的記憶體空間位址 就是 &a 如果要知道具體的 可以使用%p列印位址出來
scanf("%d",&a);的含義: 從外部擷取一個值 存儲到 a的位址 就變成了 a的值
此處的位址叫做虛拟位址,是計算機作業系統對于存儲空間的編号,
這個編号每次都會分給不同的程式
********************關鍵内容*****************
變量的通路:
ex: int a;
a = 10; //給 a這個變量指派
int b = a; //将 a的值 指派給 b
1、存儲:即講一個值指派給變量 這個過程是存儲 存儲的時候變量名一般都在左邊
是以稱之為 引用變量的左值
2、讀取:即将該變量的子指派給其他變量 這個過程叫做讀取 讀取的時候變量名一般都在右邊
是以稱之為 引用變量的右值
左值 代表:代表存儲空間
右值 代表:代表存儲空間中的值
**********************************************
4.2.1 整型變量 (無論是整型 or短整型 or長整型都可以使用 signed 與 unsigned 修飾!
使用signed修飾的時候 signed可以預設:
重要:整型資料在計算機記憶體中的存儲方式 是以二進制的補碼方式存儲的!
無論正負都是以補碼方式存儲
正數的補碼就是源碼
負數的補碼就是其絕對值的反碼+1
對于無符号的資料 就是存儲 源碼! 沒有-
有符号資料最高位是符号位: 對于整個運算過程中而言符号位參與運算!
在x86 32位機器上:
int 占4位元組 表示範圍為 - 2^31 ---- 2^31-1
short 占2位元組 表示範圍為 -2^15 ---- 2^15-1
long 占4位元組的 表示範圍同 int
long long 占8位元組 -2^63 --- 2^63-1
思考:
1、請問 int類型的 最大值在記憶體中的存儲應該長什麼樣?
必須是正數 正數的符号為 0 其他位資料 全為1
0 111 1111 1111 1111 1111 1111 1111 1111
1符号位 -------------------------------------- 全1才能最大
2、請問最大的負數怎麼表示?就是 -1
1 111 1111 1111 1111 1111 1111 1111 1111 最大的負數
-1 負數 |-1| = 1 0000 0000 0000 0000 0000 0000 0000 0001
1111 1111 1111 1111 1111 1111 1111 1110
1111 1111 1111 1111 1111 1111 1111 1111
3、請問最小的負數怎麼表示?
1 000 0000 0000 0000 0000 0000 0000 0000
1符号位 -------------------------------------- 後面全為0 則是最小的負數
最小負數是多少 傳回 先減1 再取反 得到絕對值的源碼 再加-号
0 111 1111 1111 1111 1111 1111 1111 1111
1 000 0000 0000 0000 0000 0000 0000 0000 //絕對值的源碼 - 2^31
拓展: 介紹一個運算符 sizeof()
注意 sizeof 并不是函數 而是一個運算符 是用來求一個資料類型所占存儲空間的
sizeof('a') = 4
4.2.2 字元變量
定義格式: char 變量名;
ex: char ch = 'a';//定義了一個字元變量 ch 指派為 'a';
char c = 97; //定義了 一個字元變量 c 指派為 97
//這裡的c 與ch 完全等價 因為 'a' 的ASCII值為 97 是以得出結果 97 等價于 'a';
原因在 計算機計算中 能夠參與運算的隻有 int double 偶爾有float
這裡的 'a' 本質就是 97
字元變量在記憶體中的存儲同樣遵守整型變量的存儲規則
即char型也是整型 隻不過是一個8位整型 每一個資料 都對應一個含義 就是ASCII
相當于約定了 一個編号 這個編号對應每一個具體的字元:
練習: unsigned char c = 256; //成立嗎?如果不成立請說明原因
unsigned char 的取值為 0 - 2^8 - 1 =》0 - 255
是以在邏輯上 256超過了255 不成立 因為存儲不下 但是在運作中不會有錯
ex: unsigned char c = 256;
printf("c = %d\n",c);
報警告:warning: large integer implicitly truncated to unsigned type [-Woverflow]
unsigned char c = 256;
//超出了能夠表示的範圍 即長指派給短,則隻指派低位
練習: unsigned char ch = 128;
printf("%d",ch); ===> 128
char c = 128;
printf("%d",c); ====> -128
1000 0000 => 這是一個負數 最高位符号位 為 1 為負數 推回源碼
先-1 再取反 得出結果是1 000 0000 =》128 由于是負數 是以是 -128
4.2.3 浮點變量
單精度 float 占四個位元組 32位 自動保留6位小數
雙精度 double 占8個位元組 64位 自動保留6位小數 但是精度可以再衍生
浮點數怎麼存儲: 所有人都需要知道 浮點數的存儲遵守國際标準 IEEE754
到底如何存儲 以下内容如果可以看懂 就看懂 看不懂沒有任何關系:
浮點數的存儲 使用二進制的科學計數法:N = (-1)^s *1.M * 2^(E-偏置量)
每一個資料對應的位如下:
類型 符号位s 階碼E 尾數M 總位數 偏置量
float 1 8 23 32 127
double 1 11 52 64 1023
一個浮點數的存儲: ex: 12.456
temp1: 整數部分轉化為 二進制
1100
temp2: 小數部分轉化為 2進制
拿小數部分*2 依次取出來的整數 取到沒有小數為止 有些是取不盡的則取23位即可
ex::0.456 就是取不盡的
0.456*2 = 0.912 0
0.912*2 = 1.824 1
0.824*2 = 1.648 1
0.648*2 = 1.296 1
0.296*2 = 0.592 0
0.592*2 = 1.184 1
.............
0.456 =》 .0111 0100 1011 1100 0011 0101
temp3:将小數和整數整合在一起
1100.0111 0100 1011 1100 0011 0101
temp4: 表示成 1.M的形式 如果小數點往左移 則記錄移位次數為 +
如果小數點右移 則計算依次次數為 -
1.1000111 0100 1011 1100 0011 0101 =》 1.M
小數點挪了 +3位
temp5:求階碼
E = 偏置量 + 移位個數
E = 127 + 3 = 130
轉化為 2進制
000 0010 =》 1000 0000 + 10 =》1000 0010
temp6:求尾數 小數點後的23位
1000 1110 1001 0111 1000 011 //23位
temp7 整合表示: 符号位 階碼E 尾數
0 1000 0010 1000 1110 1001 0111 1000 011
以上就是 12.456 在計算機中的存儲
4.2.4 變量的列印
1、整型變量的列印: 同整型常量的列印 隻不過将常量換為變量名即可
如果是一個無符号的整數,需要以無符号的方式列印 使用%u 列印
ex: int a = 5;
printf(" %d , %d\n",10,a); => 10 ,5
除了以 %d 列印外 %d 可以約定列印資料的位數 ex: %3d %6d ...
測試:short s = 65535; 是16位資料中的全1
1111 1111 1111 1111 就是最大的負數 -1
printf("s = %u,s = %d\n",s,s); => 思考是多少?
s = 0xFFFFFFFF ,s = -1;
原因:這是一個 短指派長的問題 高位補全1
2、浮點資料的列印 與浮點常量的列印類似
float 類型使用 %f 列印
double 類型使用 %lf 列印
注意: %x.yf 含義為 整數部分為 x位 小數部分為 y位 小數自動四舍五入!
3、字元變量的列印 同 字元常量的列印
————————補充:長賦短短賦長問題 ————————
長賦短 ex: 259 //整型常量 并且是一個 >0 的數 正數 存儲的時候存儲源碼
1111 1111
0100
———————》 1 0000 0011 259的源碼
char c = 259; =》 C占一個位元組 8位
而259占 9位 存儲不下隻存儲底八位
存儲 0000 0011 =》符号位為0 正數 即為3
短賦長 短的直接指派進去 高位根據資料情況來補
無符号數:高位補0
有符号數:高位補符号位
ex: short s = 65535;
printf("%u,%d\n",s,s);
//65535 是一個整型常量 > 0 數 源碼 //整型是4位元組
0000 0000 0000 0000 1111 1111 1111 1111
s占兩個位元組 是以 應該隻存儲低16位
1111 1111 1111 1111 //這是一個有符号的數
無論是%d 還是 %u 都是列印32位數的
%d 最高位為符号位 表示一個負數 推回源碼 先-1 再取反
1111 1111 1111 1110
0000 0000 0000 0001 =》1 =》-1
%u 轉成無符号32位資料 但是 s本身是一個有符号的整數 補全的時候補符号位
1111 1111 1111 1111
補充16個1 再高16位
1111 1111 1111 1111 1111 1111 1111 1111
------------------------------
補的符号位
ex: char c = 129; //
short s = c;
printf("%d",s);
129是一個大于0的整數 存儲 是一個長賦短的問題
1000 0001
C裡面存儲 1000 0001 并且是一個有符号的資料 存儲到s中
s = 1111 1111 1000 0001
-127
————————————————————————————
5.C語言中不同類型指派的問題
5.1 範圍大的指派給範圍小的 隻取低位元組指派 長 賦 短
ex: char c = 256;
将256這個值存儲到 c表示的空間中
256的源碼是 1 0000 0000
但是char隻能存儲 8位資料 是以取後面的 8位存儲 8個0存儲
c 的值最終為 0!
練習: short s = 632767;
printf("%s\n",s);
5.2 範圍小的 指派給範圍大的 即 短 賦 長
ex: char c = 129;
int x = c;
printf("%d",x); x = -127?
因為char類型範圍是-128到127,129超出了char的表達範圍,char到127之後如果再加1,就成了-128了,129是給127加了2,是以就成了-127了,也就是說,當值超過資料類型表達範圍的時候,比如說達到了最大值,如果再加1的話,就回到了最小值
規則:無符号資料 短賦長 指派到低位元組 高位全部補0
有符号資料 短賦長 指派到低位元組 高位全部補符号位
c = 129;
129 的源碼是 1000 0001 c中存儲這個資料
這個數是一個 負數
1000 0001 是負數 則當做補碼 推回源碼 -1 再取反
1000 0000 取反 0111 1111 =》127 是 -127
指派給 x x的值 在高位補符号位
1111 1111 1111 1111 1111 1111 1000 0001 // 1是符号位 高位全部補1
減1 再取反 1111 1111 1111 1111 1111 1111 1000 0000
0000 0000 0000 0000 0000 0000 0111 1111 127 是以 是 -127
5.3 浮點資料 指派給整型資料 隻指派整數部分 小數部分丢棄
5.4 整型資料 指派給浮點資料 則 小數部分為 0
介紹幾個基本的函數:// char ch = getchar(); 相當于scanf("%c",&ch);
printf
scanf 注意 scanf中除了占位符之外 其他的符号都不要加
putchar /getchar
ex: char c = 'a';
putchar(c); 即可完成輸出 c的值
putchar('0');即可輸出字元 0
putchar(48);即輸出 0