第4章 常量
1. 常量特點
程式執行時,其值不能改變的量,即為常量。
2. 常量分類
字面量常量
識別符號常量
3. 常量定義方式(識別符號常量)
① #define 宏定義
② const 關鍵字(C99標準增加)
4. 兩種定義方式區別
型別檢查: const 編譯階段會進行型別檢查,#define 方式不會
執行時機: const 在程式執行的時在記憶體中建立; #define 在預處理階段進行文字替換
第5章 二進位制
1. 進位制
(1)常見進位制
二進位制、十進位制、十六進位制
(2)不同進位制的表示
預設十進位制
0b開頭表示二進位制
0x開頭表示十六進位制
(3) 不同進位制輸出格式佔位符
%d :十進位制整數。
%x :十六進位制整數。
%#x :顯示字首 0x 的十六進位制整數。 ——x的大小寫
%#X :顯示字首 0X 的十六進位制整數。
2. 進位制轉換
注:一般進位制轉換,其他進位制 轉 十進位制 × ,十進位制 轉 其他進位制 ÷
詳細說明:
- 其他(幾)進位制 轉 十進位制
規則:從最低位開始,將每個位上的數提取出來,乘以 幾 的(位數-1)次方,然後求和。
- 十進位制 轉 其他(幾)進位制
規則:將該數不斷除以 幾 ,直到商為0為止,然後將每步得到的餘數倒過來,就是對應的 幾 進位制。
八四二一法: 是一種快速轉換數字的方法,主要用於二進位制、八進位制和十六進位制之間的轉換。
(1)二進位制與十進位制之間相互轉化
8421公式:
2^0=1
2^1=2
2^2=4
2^3=8
2^4=16
2^5=32
2^6=64
2^7=128
2^8=256
2^9=512
2^10=1024 ——對應湊整
二進位制轉十進位制:
1011=1*2^3 + 0*2^2 + 1*2^1 + 1*2^0
=8+0+2+1
=11
十進位制轉二進位制:(用2的幾次方的得數湊整)
57=2^5 + 2^4 + 2^3 + 2^0
=32+16+8+1
=100000+10000+1000+1
=111001
(2)十六進位制和十進位制(瞭解)
(3)二進位制與十六進位制之間的相互轉化(重點)
4個二進位制位相當於1個十六進位制位,對應位數相互轉換就可以 中間會使用十進位制作為橋樑
1111——>15——>F
3. 原碼 反碼 補碼
正數和0:
原碼、反碼、補碼都一樣
負數:
原碼:符號位為1,其它轉為對應的二進位制數字即可
反碼:原碼基礎上,符號位不變,其他位取反
補碼:反碼基礎上,+1
注:計算機上儲存的是補碼
補碼計算器:https://www.lddgo.net/convert/number-binary-code
第 6 章 資料型別
bit——位元(b)
byte——>位元組(B)
1. 整數型別
(1)整型劃分
型別名稱 | 儲存長度 |
---|---|
short int 短整型 | 2位元組 |
int 整型 | 4位元組 |
long int 長整型 | 4或8位元組 |
long long int 長長整型 | 8位元組 |
注:① 每種型別又分為有符號(signed)和無符號(unsigned)
② 預設表示有符號,如 int 表示 signed int
③int、signed 都可省略
int = signed int =signed;short = signed short int
(2)字面量字尾(不需要記)
資料型別 | 字面量字尾 | 資料型別 | 字面量字尾 |
---|---|---|---|
int | 沒有 | unsigned int | U |
long | L | unsigned long | UL |
long long | LL | unsigned long long | ULL |
注:① 字面量字尾不區分大小寫
② U和L可以自由組合,UL等同於LU,ULL等同於LLU
③short 與 int 字面量字尾使用相同
(3)格式佔位符
資料型別 | 格式佔位符 | 資料型別 | 格式佔位符 |
---|---|---|---|
int | %d | unsigned int | %u |
short | %hd | unsigned short | %hu |
long | %ld | unsigned long | %lu |
long long | %lld | unsigned long long | %llu |
注:資料型別與格式佔位符要一一對應
(4)等寬整數型別 ——只是自行定義的,為了增加程式碼的適配性,提高程式的可移植性
位於標準庫標頭檔案 stdint.h
中
int8_t uint8_t
int16_t uint16_t
int32_t uint32_t
int64_t uint64_t
int8_t n1 = 100; // 8個二進位制位 1 位元組的有符號整數
uint8_t n2 = 101; // 8個二進位制位 1 位元組的無符號整數
int32_t n3 = 10; // 32個二進位制位 4 位元組的有符號整數
uint32_t n4 = 11; // 32個二進位制位 4 位元組的無符號整數
2. 浮點型別 ——常用的是double
(1)浮點型別劃分
資料型別名 | 儲存長度 | 有效小數位數 |
---|---|---|
float 單精度 | 4 | 6~9 |
double 雙精度 | 8 | 15~18 |
long double 長雙精度 | 10~16 | 18或更多 |
都有符號
預設是double
有效小數位顯示的情況:
float、double、Long double的輸出顯示的有效小數位:預設輸出6位
注:
printf("float: n3=%.2lf \n",n3);
//在%後加入 .2 就表示輸出預設顯示幾位小數,預設顯示6位小數,不過在計算機上儲存的是對應的儲存長度 及 有效小數位,只是輸出顯示的設定罷了
(2)浮點型別字面量字尾(不需要記)
注:字面量字尾加不加都可以
型別 | 字面量字尾 |
---|---|
float | F |
double | 沒有 |
long double | L |
注:字面量字尾不區分大小寫!
小數0.55前的0可以省略,等同於 0.55
(3)格式佔位符
資料型別 | 十進位制形式格式佔位符 | 科學計數法格式佔位符 |
---|---|---|
float | %f | %e |
double | %lf | %le |
long double | %Lf | %Le |
分別對應兩種形式的佔位符使用:
%.3 小數保留3位 %e 保留一個整數位
注:printf() 輸出的時候,%f 可以表示 float 和 double
scanf() 獲取輸入的時候,只有 %lf 表示double
科學計數法說明:
double n2 = 5.2e2; //5.2*10^2
(4) 浮點型別儲存原理
浮點數會分成 符號位、指數位、尾數位進行儲存
3. 字元型別
1. 字面量表示
單引號
2. 跳脫字元
\n ——換行符
\' ——表示'
\\ ——表示\
\t ——表示製表符
3. 字元型別的本質
本質是一個位元組的整數,分為 char 和 unsigned char
4.格式佔位符
使用%c表示char型別。
5. ascII 碼 *(記)
A 65
a 97
char字元型別中數字表示的含義,對應於ASCII
1、
char c9 = 199; //199相對於char型別是指的ASCII值,199超過了ASCII值的範圍
char c10 = 65; //65在ASCII中對應的是A,而1對應的是空白
2、1對應的是ASCII值為 空白 ,所以輸出顯示的也是空白
4. 布林型別
1. 第一種方式
C89標準,使用宏定義(#define )
2. 第二種方式
C99標準,新增 _Bool 型別
3. 第三種方式
C99標準,標準庫標頭檔案 <stdbool.h>
bool true false
總結:三種方式都可以修改布林型別的變數,不過分為兩種:1、第一種為一種,可以直接修改布林型別變數的值
2、第二、三為一種,修改時:0為0,其他非零都為1
第一種 使用宏定義
#include <stdio.h>
#define BOOL int
#define TRUE 1
#define FALSE 0
int main()
{
//定義布林型別的變數
BOOL is_ok =TRUE;
BOOL is_pass = FALSE;
//is_pass可以被修改
is_pass =-6;
printf("is_ok=%d, is_pass=%d \n",is_ok,is_pass);
//條件判斷
if(is_ok)
{
printf("OK! \n");
}
else
{
printf("不OK!\n");
}
if(is_pass)
{
printf("PASS!\n");
}
else
{
printf("不PASS!\n");
}
}
第二種 新增 _Bool 型別
#include <stdio.h>
int main()
{
//定義布林型別的變數
_Bool is_ok = 1;
_Bool is_pass = 0;
第三種 標準庫標頭檔案 <stdbool.h>
#include <stdio.h>
#include <stdbool.h>
int main()
{
// 定義布林型別的變數
bool is_ok = true;
bool is_pass = false;
附錄
修改配置,提高警告等級
開啟 .vscode
資料夾下的 tasks.json
檔案,新增如下選項:
"-Wall"
最終效果如下:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活動檔案",
"command": "D:\\Program Files\\mingw64\\bin\\gcc.exe",
"args": [
"-fdiagnostics-color=always",
"-Wall",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "偵錯程式生成的任務。"
}
],
"version": "2.0.0"
}
下圖示,橙色框中的兩個要挨在一起