變數和數據類型 所有定義的變數都存在記憶體中,定義變數需要記憶體空間,不同類型的變數需要的記憶體空間是不同的 數據類型作用:告訴編譯器,我這個數據在記憶體中需要多大的空間,編譯器預算對象(變數)分配的記憶體空間大小。 1.常量與變數 1.1 常量 常量:程式運行中不能改變的量 整型常量:1 200 字元常量: ...
變數和數據類型
所有定義的變數都存在記憶體中,定義變數需要記憶體空間,不同類型的變數需要的記憶體空間是不同的
數據類型作用:告訴編譯器,我這個數據在記憶體中需要多大的空間,編譯器預算對象(變數)分配的記憶體空間大小。
1.常量與變數
1.1 常量
常量:程式運行中不能改變的量
- 整型常量:1 200
- 字元常量: 'c'
- 字元串常量:"hello"
- 實型常量(浮點型常量):3.14,0.125
整型常量 | 100,200,-100,0 |
---|---|
實型常量 | 3.14 , 0.125,-3.123 |
字元型常量 | ‘a’,‘b’,‘1’,‘\n’ |
字元串常量 | “a”,“ab”,“12356” |
1.2 變數
1. 變數的空間大小
變數:程式運行中可以被改變的量,存在於記憶體中
- 變數需要定義,變數的定義:在記憶體中開闢空間,告訴編譯器我有這個變數(聲明),變數定義的本質:在記憶體中開闢空間,給這個空間取名**
- 數據類型 變數名(數據類型告訴編譯器占多大的空間)
- int類型在記憶體中占4位元組
- short類型在記憶體中占2位元組
- long類型,在windows中都是4位元組,linux中,32位系統4位元組,64位系統8位元組
- char類型在記憶體中占1個位元組
- float類型在記憶體中占4位元組,用於存儲小數(float精度能達到7位小數)
- double類型在記憶體中占8位元組(double精度能達到15位小數)
char short int long都可以用來存儲整數
int a; // 在記憶體中定義了一個變數a,占int類型大小4個位元組
char b; // 在記憶體中定義了一個變數b,占一個位元組
2. 變數的命名規則
- 定義變數時,變數名必須以字元和下劃線開頭,不能以數字開頭
- 變數取名不能為關鍵字
- 變數取名的時候要顧名思義
- 變數定義時要區分大小寫
變數定義的本質:在記憶體中開闢空間,給這個空間取名 - extern 數據類型 變數名--告訴編譯器有這個變數,但是這裡不開闢空間
int num;
num = 100;
//int num = 200; 定義變數並且初始化
printf("num = %d\n", num);
return 0;//成功完成
extern short SUM; // extern 告訴編譯器我有這個變數,沒有定義,不能進行賦值
// 聲明有SUM,並沒有開闢空間,只有在定義的時候開闢空間
// 定義可以在其他.c文件中定義變數或者main函數外的位置等
#define MAX 10 // MAX相當於一個常量
MAX = 100; // 報錯,MAX是一個常量,常量不可以被更改
3. 變數的特點
- 變數在編譯時為其分配相應的記憶體空間
- 可以通過其名字和地址訪問相應的記憶體
4. 聲明和定義的區別
- 聲明變數不需要建立存儲空間,如:extern int a;
- 定義變數需要建立存儲空間,如:int b;
#include <stdio.h>
int main()
{
//extern 關鍵字只做聲明,不能做任何定義,後面還會學習,這裡先瞭解
//聲明一個變數a,a在這裡沒有建立存儲空間
extern int a;
a = 10; //err, 沒有空間,就不可以賦值
int b = 10; //定義一個變數b,b的類型為int,b賦值為10
return 0;
}
從廣義的角度來講聲明中包含著定義,即定義是聲明的一個特例,所以並非所有的聲明都是定義:
- int b 它既是聲明,同時又是定義
- 對於 extern b來講它只是聲明不是定義
一般的情況下,把建立存儲空間的聲明稱之為“定義”,而把不需要建立存儲空間的聲明稱之為“聲明”。
#include <stdio.h>
#define MAX 10 //聲明瞭一個常量,名字叫MAX,值是10,常量的值一旦初始化不可改
int main()
{
int a; //定義了一個變數,其類型為int,名字叫a
const int b = 10; //定義一個const常量,名為叫b,值為10
//b = 11; //err,常量的值不能改變
//MAX = 100; //err,常量的值不能改變
a = MAX;//將abc的值設置為MAX的值
a = 123;
printf("%d\n", a); //列印變數a的值
return 0;
}
1.3 關鍵字
1.4 const修飾的變數
const關鍵字修飾的變數不能被更改
#include <stdio.h>
int main()
{
int a; //定義了一個變數,其類型為int,名字叫a
const int b = 10; //定義一個const常量,名為叫b,值為10
//b = 11; //err,常量的值不能改變
return 0;
}
const修飾的變數b,告訴編譯器,不能通過b(變數名)修改這塊空間的內容,但是可以通過地址進行修改
2.進位
進位也就是進位制,是人們規定的一種進位方法。 對於任何一種進位—X進位,就表示某一位置上的數運算時是逢X進一位。 十進位是逢十進一,十六進位是逢十六進一,二進位就是逢二進一,以此類推,x進位就是逢x進位。
2.1 二進位
二進位是計算技術中廣泛採用的一種數制。二進位數據是用0和1兩個數位來表示的數。它的基數為2,進位規則是“逢二進一”,借位規則是“借一當二”。
當前的電腦系統使用的基本上是二進位系統,數據在電腦中主要是以補碼的形式存儲的。
- C語言中是沒有辦法書寫二進位的
1 術語
術語 | 含義 |
---|---|
bit(比特) | 一個二進位代表一位,一個位只能表示0或1兩種狀態。數據傳輸是習慣以“位”(bit)為單位。 |
Byte(位元組) | 一個位元組為8個二進位,稱為8位,電腦中存儲的最小單位是位元組。數據存儲是習慣以“位元組”(Byte)為單位。 |
WORD(雙位元組) | 2個位元組,16位 |
DWORD | 兩個WORD,4個位元組,32位 |
1b | 1bit,1位 |
1B | 1Byte,1位元組,8位 |
1k,1K | 1024 |
1M(1兆) | 1024k, 1024*1024 |
1G | 1024M |
1T | 1024G |
1Kb(千位) | 1024bit,1024位 |
1KB(千位元組) | 1024Byte,1024位元組 |
1Mb(兆位) | 1024Kb = 1024 * 1024bit |
1MB(兆位元組) | 1024KB = 1024 * 1024Byte |
2. 十進位轉換二進位
十進位轉化二進位的方法:用十進位數除以2,分別取餘數和商數,商數為0的時候,將餘數倒著數就是轉化後的結果。
十進位的小數轉換成二進位:小數部分和2相乘,取整數,不足1取0,每次相乘都是小數部分,順序看取整後的數就是轉化後的結果。
2.2 八進位
八進位,Octal,縮寫OCT或O,一種以8為基數的計數法,採用0,1,2,3,4,5,6,7八個數字,逢八進1。一些編程語言中常常以數字0開始表明該數字是八進位。
八進位的數和二進位數可以按位對應(八進位一位對應二進位三位),因此常應用在電腦語言中。
十進位轉化八進位的方法:
用十進位數除以8,分別取餘數和商數,商數為0的時候,將餘數倒著數就是轉化後的結果。
0123 // 八進位,八進位數之前加0
2.3 十六進位
十六進位(英文名稱:Hexadecimal),同我們日常生活中的表示法不一樣,它由0-9,A-F組成,字母不區分大小寫。與10進位的對應關係是:0-9對應0-9,A-F對應10-15。
十六進位的數和二進位數可以按位對應(十六進位一位對應二進位四位),因此常應用在電腦語言中。
十進位轉化十六進位的方法:
用十進位數除以16,分別取餘數和商數,商數為0的時候,將餘數倒著數就是轉化後的結果。
2.4 C語言各個進位數的表示
十進位 | 以正常數字1-9開頭,如123 |
---|---|
八進位 | 以數字0開頭,如0123 |
十六進位 | 以0x開頭,如0x123 |
二進位 | C語言不能直接書寫二進位數 |
#include <stdio.h>
int main()
{
int a = 123; //十進位方式賦值
int b = 0123; //八進位方式賦值, 以數字0開頭
int c = 0xABC; //十六進位方式賦值
//如果在printf中輸出一個十進位數那麼用%d,八進位用%o,十六進位是%x
printf("十進位:%d\n",a );
printf("八進位:%o\n", b); //%o,為字母o,不是數字
printf("十六進位:%x\n", c);
return 0;
}