目錄
一、學習目標:
二、數據基本類型
整型
浮點型 / 實型
字符
字符串
布爾型數據
三、重要的雜七雜八知識點
常量與變量
標準輸入
sizeof運算符:
類型轉換
數據類型的本質
整型數據尺寸
可移植性整型
拿下第一個C語言程序
總結
一、學習目標:
知識點:
- 一文掌握 C 語基礎數據類型
- 掌握常量變量運用、輸入輸出等操作
- 簡單了解內存大小計算和類型轉換
二、數據基本類型
整型
- 概念:表達整數類型的數據
- 語法:
int a = 123;
// 定義了一個專門用來存儲整數的變量a
- 需要注意的地方:
- int 的本意是 integer,即整數的意思
- int a 代表在內存中開辟一塊小區域,稱為 a,用來存放整數,a 一般被稱為變量。
- 變量 a 所占內存大小,在不同的系統中是不一樣的,64位 32 位 系統典型的大小是4個字節
- 變量 a 有固定的大小,因此也有取值范圍,典型的范圍是:-2147483648到2147483647
- 整型修飾符
- short:用來縮短整型變量的尺寸,減少取值范圍并節省內存,稱為短整型
- long:用來增長整型變量的尺寸,增大取值范圍并占用更多內存,稱為長整型
- long long:用來增長整型變量的尺寸,增大取值范圍并占用更多內存,稱為長長整型
- unsigned:用來去除整型變量的符號位,使得整型變量只能表達非負整數
short int a; // 短整型
long int b; // 長整型
long long int c; // 長長整型
unsigned int e; // 無符號整型
unsigned short int f; // 無符號短整型
unsigned long int g; // 無符號長整型
unsigned long long int h; // 無符號長長整型
- 使用整型修飾符后,關鍵字 int 可以被省略:
short a; // 短整型
long b; // 長整型
long long c; // 長長整型
unsigned e; // 無符號整型
unsigned short f; // 無符號短整型
unsigned long g; // 無符號長整型
unsigned long long h; // 無符號長長整型
- 符號位:
- 有符號的整型數據,首位(最高位)為符號位,0表示正數,1表示負數。
- 無符號的整形數據,沒有符號位。
- 編碼形式:
- 原碼:正數直接使用二進制來表達,比如a=100,在內存中是 00…001100100
- 補碼:負數用絕對值取反加一來表達,比如a=-3,在內存中是11…1111111101
- 補碼 = 該負數的絕對值的源碼 --> 取反 --> + 1
- 注意負數的補碼在取反加一的時候,符號位是不動的
- 溢出:超過數據所能表達的范圍,稱為溢出,就像汽車里程表,最大值和最小值是相鄰的
- 進制:源碼中可以使用八進制、十進制或十六進制,但實際數據在內存中一律是二進制存儲
- 十進制(默認),比如1099
- 八進制,比如013 (這里的0 是八進制的前綴)
- 十六進制,比如0x6FF0A (0x 則是16進制的前綴)
// 以下3個變量看起來都是 100 但實際由于進制不同則他們表示的數值有有差異:
int a1 = 100 ;? ? ?int a2 = 0100;? ? ? int a3 = 0x100 ;
格式控制符
十進制輸出: int 整型:%d short 整型:%hd, h代表half,即一半的存儲字節 long 整型:%ld long long 整型:%lld 八進制輸出: 顯示不同進制的前綴: %#o 十六進制輸出: %#x
示例:
// 以下3個變量看起來都是 100 但實際由于進制不同則他們表示的數值有有差異
int a1 = 100 ;
int a2 = 0100;
int a3 = 0x1AB ;printf("a1:%d a2:%d a3:%d\n" , a1 , a2 , a3); // %d 十進制輸出整形
printf("a1:%#x a2:%#x a3:%#X\n" , a1 , a2 , a3); // %x 十六進制輸出整形 # 則可以輸出十六進制的前綴0x// x 可以是大寫也可以是小寫,對應的是十六進制中字符的大小寫// %#x -> 0xab// %#X -> 0XAB short s ;
int i ;
long l ;
long long ll ;printf( "s:%d\n" , s );
printf( "i:%d\n" , i );
printf( "l:%ld\n" , l );
printf( "ll:%lld\n" , ll );
浮點型 / 實型
- 概念:用來表達實數的數據類型
- 分類:
- 單精度浮點型(float),典型尺寸是4字節
- 雙精度浮點型(double),典型尺寸是8字節
- 長雙精度浮點型(long double),典型尺寸是16字節
- 占用內存越多,能表達的精度越高
float f1; // 單精度
double f2; // 雙精度
long double f3; // 長雙精度
1234.5678 -> 1.2345678*10^3
0.0001234567 -> 1.234567*10^-4
字符
實際上他就是一個單字節的整形,也可以與整形一樣參與運算。
char ch1 = 'a'; // 'a'是字符常量,代表字母a的ascii值 97 char ch2 = '\n'; // '\n'是不可見字符常量,代表回車
????????計算機中存儲的都是1和0,因此各種字符都必須被映射為某個數字才能存儲到計算機中,這種映射關系形成的表稱為 ASCII 碼表。
字符本質上就是一個單字節的整型,支持整型所有的運算。
比如:
char c1 = 20;
char c2 = c1 + 'a'; // 等價于 char c2 = 20 + 97;printf("%c\n", c2); // 以字符形式輸出117,即 'u'
printf("%d\n", c2); // 以整型形式輸出117
字符串
- 定義
// 字符串的定義方式有兩種:指針和數組
char *s1 = "abcd"; // 使用字符指針來指向一個字符串
char s2[]= "abcd"; // 使用字符數組來存儲字符串// 注意,使用數組來定義字符串時,方括號[]里面的數字可以省略
// 不省略也可以,但必須必字符串實際占用的內存字節數要大,比如:
char s3[] = "apple";
- 在內存中的存儲
- 在內存中實際上是多個連續字符的組合
- 任何字符串都以一個 ‘\0’ 作為結束標記,例如:“funny story” 的內存如下
布爾型數據
- 概念:布爾型數據只有真、假兩種取值,非零為真,零為假。
- 語法:
bool a = 1; // 邏輯真,此處1可以取其他任何非零數值
bool b = 0; // 邏輯假
- 注意:
- 邏輯真除了 1 之外,其他任何非零數值都表示邏輯真,等價于 1。
- 使用布爾型 bool 定義變量時需要包含系統頭文件 stdbool.h。
- 布爾型數據常用語邏輯判斷、循環控制等場合。
三、重要的雜七雜八知識點
常量與變量
- 概念:不可改變的內存稱為常量,可以改變的內存稱為變量
舉例:
int a = 100; // a是變量,而100是常量float f = 3.14; // f是變量,而3.14是常量char s[] = "abcd"; // s是變量,"abcd"是常量
- 常量的類型
常量舉例 | 說明 | 類型 |
100 | 整型 | int |
100L | 長整型 | long |
100LL | 長長整型 | long long |
100ULL | 無符號長長整型 | unsigned long long |
3.14 | 雙精度浮點型 | double |
3.14L | 長雙精度浮點型 | long double |
‘a’ | 字符型 | char |
“abcd” | 字符指針(字符串) | char * |
標準輸入
- 概念:鍵盤是系統的標準輸入設備,從鍵盤中輸入數據被稱為標準輸入
- 相關函數:
scanf(); // 格式化輸入函數
fgets(); // 字符串輸入函數int a;
float f;
scanf("%d", &a); // 從鍵盤輸入一個整型,放入指定的內存地址 &a 中
scanf("%f", &f); // 從鍵盤輸入一個浮點數,放入指定的內存地址 &f 中scanf("%d%f", &a, &f); // 從鍵盤依次輸入一個整型和一個浮點型數據,用空白符隔開char c;
char s[10];
scanf("%c", &c); // 從鍵盤輸入一個字符,放入指定的內存地址 &f 中
scanf("%s", s ); // 從鍵盤輸入一個單詞,放入指定的數組 s 中(注意不是&s)fgets(s, 10, stdin); // 從鍵盤輸入一行字符串,放入數組 s 中
- 注意1:
- scanf() 與 printf() 不同,scanf() 的格式控制串不可亂寫,尤其是結尾處的 \n
- 用戶必須完全按照 scanf() 中描述的輸入格式控制串來輸入數據,否則將出錯。
- 示例:
// 此處輸入時必須帶逗號
scanf("%d,%d", &a, &b);// 此處必須先輸入a=,然后才能輸入整數
scanf("a=%d", &a); // 此處結束輸入時按下的回車符將被scanf()誤以為格式控制符,無法正常結束輸入
scanf("%d\n", &a);
實例:
#include <stdio.h>int main(int argc, char const *argv[])
{int i = 0;char ch = 0;float f = 0;char buf [32] = {0};// 如下所示,如果在輸入多項數據的時候, 從左往右第一項不匹配后會導致往后的所有項目輸入終止int ret_val = scanf( "a=%d ch=%c f=%f buf=%s" , &i , &ch , &f , buf );// 如果輸入表達式如上所示使用空格進行分割各種類型的控制符,那么在輸入的時候可以匹配空格 、 Tab 、 回車// 如果 scanf( "%d,%s,%c" , ...); 這么寫在輸入時就必須使用 ,(逗號) 進行分割// 注意千萬不要手賤在 格式控制符中加上 \n 不然會出現迷惑現象,必須多輸入一個無用的數據+\n才能解脫printf("成功輸入:%d項數據..\n" , ret_val);printf("i:%d ch:%d f:%f buf:%s\n" , i , ch , f , buf );return 0;
}
總結:
-
- sacnf 它默認從指定的文件(默認是標準輸入文件)中獲取指定格式的數據。
- 格式包含 數據的類型(%d %s %c %f ..) 以及 樣式(a=%d ch=%c \ %d,%c,%f)
- 如果輸入樣式中各項數據使用 空格分隔則與之匹配的符號可以是 空格 、 TAB 、 回車
- 如果用戶輸入的數據不匹配則scanf 會立馬停止工作,剩余的數據會留在緩沖區
拓展:
sizeof運算符:
int a = 123 ;printf("%ld\n" , sizeof a );// 當使用sizeof 求某一個變量的大小時可以省略括號
printf("%ld\n" , sizeof (a) );
printf("%ld\n" , sizeof(int) );printf("short: %ld\n" , sizeof(short) ); // 2
printf("int :%ld\n" , sizeof(int) ); // 4
printf("long : %ld\n" , sizeof(long) ); // 4(32位系統) / 8(64位系統)
printf("long long :%ld\n" , sizeof(long long ) ); // 8 (32 \ 64 位系統)
類型轉換
- 概念:不一致但相互兼容的數據類型,在同一表達式中將會發生類型轉換。
- 轉換模式:
- 隱式(默認)轉換:系統按照隱式規則自動進行的轉換
- 強制(手動)轉換:用戶顯式自定義進行的轉換
- 隱式規則:從小(低精度)類型向大(高精度)類型轉換,目的是保證不丟失表達式中數據的精度
隱式轉換示例代碼
char a = 'a'; int b = 12; float c = 3.14; float x = a + b - c;// 在該表達式中將發生隱式轉換,所有操作數被提升為float
- 強制轉換:用戶強行將某類型的數據轉換為另一種類型,此過程可能丟失精度
char a = 'a'; int b = 12; float c = 3.14; float x = a + b - (int)c;// 在該表達式中a隱式自動轉換為int,c被強制轉為int
????????不管是隱式轉換,還是強制轉換,變換的都是操作數在運算過程中的類型,是臨時的,操作數本身的類型不會改變,也無法改變。
數據類型的本質
- 概念:各種不同的數據類型,本質上是用戶與系統對某一塊內存數據的解釋方式的約定。
- 推論:
- 類型轉換,實際上是對先前定義時候的約定,做了一個臨時的打破。
- 理論上,可以對任意的數據做任意的類型轉換,但轉換之后的數據解釋不一定有意義。
17620828909 電話
17620828909 余額
int a = 123 ;
float 123
整型數據尺寸
- 概念:整型數據尺寸是指某種整型數據所占用內存空間的大小
- C語言標準并未規定整型數據的具體大小,只規定了相互之間的 “ 相對大小 ” ,比如:
- short 不可比 int 長 , 一般short為int 的一半
- long 不可比 int 短
- long 型數據長度等于系統字長
- 系統字長:CPU 一次處理的數據長度,稱為字長。比如32位系統、64位系統。
- 典型尺寸:
- char 占用1個字節
- short 占用2個字節
- int 在16位系統中占用2個字節,在32位和64位系統中一般都占用4個字節
- long 的尺寸等于系統字長 , 在32位系統中4字節, 在64位系統中8字節
- long long 在32位系統中一般占用8個字節,在64位系統中一般占用8個字節
- 存在問題:
- 同樣的代碼,放在不同的系統中,可能會由于數據尺寸發生變化而無法正常運行。
- 因此,系統標準整型數據類型,是不可移植的(不具備可移植性),這個問題在底層代碼中尤為突出。
可移植性整型
- 概念:不管放到什么系統,尺寸保持不變的整型數據,稱為可移植性整型
- 關鍵:typedef (給現有的類型取別名)
typedef int int32_t; // 將類型 int 取個別名,稱為 int32_t
typedef long int64_t;// 將類型 long 取個別名,稱為 int64_t
- 思路:
- 為所有的系統提供一組固定的、能反應數據尺寸的、統一的可移植性整型名稱
- 在不同的系統中,為這些可移植性整型提供對應的 typedef 語句
#include <stdio.h>int main(int argc, char const *argv[])
{long l = 345 ; // 不具備可移植的屬性,因在不不同的系統中他的大小有可能發生變化__int64_t k = 567 ; // 可移植數據類型,在不同的系統中他的大小都是固定的printf("long:%ld\n" , sizeof(long));printf("long long :%ld\n" , sizeof(long long));printf("__int64_t:%ld\n" , sizeof(__int64_t));return 0;
}
拿下第一個C語言程序
總結
? ? ? ? 本文介紹了C的一些基本類型知識和類型轉換要點,還有變量、常量等其他知識。理解本文所有知識點后,便可編譯一個屬于自己的小程序,算上是窺得C語皮毛矣
? ? ? ? 本文參照?粵嵌文哥 部分課件經整理和修改后發布在C站,如有轉載,請聯系本人