天天看點

一篇文章學會C語言中的基本資料類型

作者:Antonov

一:資料類型

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 沒有取值 是以無意義

  1. 派生資料類型 數組 指針 結構體 共用體 ...

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

繼續閱讀