C語言核心技術-變量和數據類型
2.1 計算機的計算單位
2.1.1 容量單位
在購買電腦時,通常會選擇高配置的內存、硬盤。例如2019款15寸的MacBookPro已經可以選配32G內存和4T的固態硬盤,而這里的32G和4T就是計算機常用的容量單位。
在物理層面,我們使用高低電平來記錄信息,通常使用高電平表示1,低電平表示0,因此在計算機底層只能認識0,1兩種狀態。而0,1能夠表示的內容太少,迫切需要更大的容量表示方法,因此誕生了字節(Byte),千字節(KB),兆字節(MB),吉字節(GB),太字節(TB),拍字節(PB),艾字節(EB),除了bit和Byte之外,從Byte到KB,MB,GB,TB,PB,EB,它們的換算都是以2的10次方即1024換算的。
1YB=1024ZB
1ZB=1024EB
1EB=1024PB
1PB=1024TB
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024B
1Byte=8bit
- 位(bit)是最小的計算機容量單位,通常用於門電路,只能存儲0或者1
- 字節(Byte)、千字節(KB)、兆字節(MB)表示網絡傳輸,文件大小。字節是最基本的容量計量單位。
- 吉字節(GB)通常用於表示計算機內存、磁盤的容量單位
- 太字節(TB),拍字節(PB)通常是用於表示雲盤、移動硬盤的容量單位
- 艾字節(EB)通常是用於表示數據中心的容量單位
現在通常筆記本的內存通常是8G,16G,32G,64G等等,而運行在筆記本之上的操作系統普遍都是64位的,因為32位系統只能使用4G內存,下面是4G的內存換算
4G=2^2 * 2^10 * 2^10 * 2^10 =4*1024*1024*1024=2^32
在購買內存或者買移動硬盤時,通常使用的存儲單位就是GB或者是TB,
但是在買4T的移動硬盤時,實際的可用容量卻只有3T多,因為計算機的存儲單位是以2的10次方(即1024)換算,而硬盤廠商們是以1000為換算單位。
4T的硬盤換算成位如下所示
4T=4*1024GB*1024MB*1024KB*1024B*8bit
而硬盤廠商的實際容量
4T=1000*1000*1000*1000*8
因此實際的可用容量是
4*1000*1000*1000*1000/1024/1024/1024/1024≈3.63T
而在一些互聯網巨頭(例如國內的BAT,國外的亞馬遜、蘋果、微軟、谷歌,臉書)公司中,可能使用到比TB更大的海量數據,也就是PB或者EB,它們的換算單位如下所示。
1PB=1024TB
1EB=1024PB
2.1.2 速度單位
-
網絡速度
網絡常用的單位是Mbps
而網絡帶寬提供商(例如長城寬帶)聲稱的百兆帶寬實際上是100Mbit/s,但是100M光纖測試的峰值速度只會有12.5MB/s,它們之間的換算是100Mbit/s=(100/8)MB/s=12.5MB/s。 -
CPU速度
CPU的速度一般是由CPU的時鍾頻率所體現的,而時鍾頻率的單位是赫茲(Hz),目前主流的CPU時鍾頻率一般都在2GHz以上,而赫茲(Hz)其實就是秒分之一,也就是每秒鍾的周期性變動重復次數的計量。
GHz即十億赫茲(10^9Hz),2GHz就是二十億赫茲,也就是說2GHz的CPU每秒可以變化20億次。
1Khz=1000hz
1Mhz=1000khz
1Ghz=1000Mhz
2.2 數據類型
2.2.1 數據為什么要分類
數據類型就是給數據分類,其目的就是合理的利用計算機的內存空間,提高存儲效率。
類型是抽象的概念,類型有大小,但是沒有空間,系統不會給類型分配空間,但是會給類型定義的變量分配空間,例如定義變量 int age =28;
時系統會給age變量分配四個字節的空間。
不同的數據類型占據不同的內存大小,其存儲數據的極限也不一樣、能夠執行的運算也是不相同的。
2.2.2 C語言常用基本數據類型
C語言中基本數據類型有整型、浮點型、字符型,布爾型。其他的類型都是由基本數據類型封裝而來的。
其中整數按照不同的字節大小有short,int,long,long long,其中long long 是C99標准支持。
浮點數按照精度不同有float,double,其中float表示單精度浮點型,double表示雙精度浮點型。
字符只有char表示,用於存儲單個字符。
布爾使用bool表示,C語言中的0表示false,1表示true。
2.2.3 sizof關鍵字查看數據類型占據的內存容量
C語言提供了提供了sizeof()關鍵字來獲取數據類型占據的內存空間。
sizeof()中可以傳數據類型名或者變量名,當傳遞變量名實際上是求變量類型的大小。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* sizeof關鍵字的使用 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/25 */
int main(int argc, char* argv[]) {
//使用printf函數輸出各個基本數據類型占據的字節數量
printf("char 占據的字節數量是%d\n", sizeof(char));
printf("short 占據的字節數量是%d\n", sizeof(short));
printf("int 占據的字節數量是%d\n", sizeof(int));
printf("long 占據的字節數量是%d\n", sizeof(long));
printf("long long 占據的字節數量是%d\n", sizeof(long long));
printf("float 占據的字節數量是%d\n", sizeof(float));
printf("double 占據的字節數量是%d\n", sizeof(double));
printf("bool 占據的字節數量是%d\n", sizeof(bool));
system("pause");
return 0;
}
需要注意的是C語言相同的數據類型在不同的操作系統環境下占據的空間是不一樣的。在Visual Studio 2019中集成了32位編譯器和64位編譯器,C程序默認是以32位運行的。
32位:sizeof()關鍵字的運行結果
如果想要切換到64位下運行,只需要將X86換成x64即可
64位:sizeof()關鍵字的運行結果
在Windows平台下long類型無論是在32位還是64位都是占據四個字節,而Linux(Ubuntu18.04)則是占據8個字節。
Ubuntu18.04下sizeof()關鍵字測試
//
// Created by guanglei on 8/28/19.
//
#include <stdio.h>
#include <float.h>
#include <stdbool.h>
int main(){
printf("char 占據的字節數量是%d\n",sizeof(char));
printf("short 占據的字節數量是%d\n",sizeof(short));
printf("int 占據的字節數量是%d\n",sizeof(int));
printf("long 占據的字節數量是%d\n",sizeof(long));
printf("long long 占據的字節數量是%d\n",sizeof(long long));
printf("float 占據的字節數量是%d\n",sizeof(float));
printf("double 占據的字節數量是%d\n",sizeof(double));
printf("long double 占據的字節數量是%d\n",sizeof(long double));
printf("bool 占據的字節數量是%d\n",sizeof(bool));
return 0;
}
程序運行結果
2.2.4 數據的有符號和無符號
有符號表示數據有正負之分,數值二進制的最高位(左邊第一位)為符號位,0表示整數,1表示負數,其他位為負數。以兩個字節的數據1為例子,其二進制表示為0000 0000 0000 0001,因為是正數,因此最高位是0,-1的二進制表示為1000 0000 0000 0001,因為是負數,因此最高位是1。
無符號數表示數據沒有正負之分,全是正數(即大於等於0的數),無符號數沒有符號位,全是數據位。以兩個字節的數據1為例子,其二進制表示為0000 0000 0000 0001。
C語言中的整數常量默認都是有符號的,如果要使用無符號的常量,需要在常量值后面添加U后綴。
C語言中的整數變量默認都是有符號的,如果要使用無符號的變量,需要在變量類型前面加上unsigned關鍵字。
有符號整數常量和無符號整數常量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 有符號整數常量和無符號整數常量 常量默認是有符號數 如果要使用無符號使用U結尾 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/11/02 */
int main(int argc, char* argv[]) {
// 10默認是有符號
//有符號整型
printf("%d \n", 10);
//10U是無符號數 printf輸出無符號int 使用格式 %u
printf("%u \n", 10U);
// 有符號長整型
printf("%ld \n", 10L);
//無符號長整型
printf("%lu \n", 10UL);
system("pause");
return 0;
}
有符號和無符號變量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 變量默認是有符號的,如果要聲明無符號的變量,使用unsigned聲明 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/11/02 */
int main(int argc, char* argv[]) {
//整數變量默認是有符號的
int age = 26;
//無符號整數變量
unsigned int data = 39;
printf("age =%d \n",age);
printf("date = %u \n",data);
system("pause");
return 0;
}
2.2.5 數據類型的極限
數據類型都有其存儲范圍(即存儲的最大值和最小值),C語言中的limits.h和float.h頭文件中分別定義了整數和浮點數的極限。在使用數據類型時,切勿超過其極限,否則會造成程序異常。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
/* 數據類型的極限 數據類型都有其存儲范圍(即存儲的最大值和最小值),C語言中的limits.h和float.h頭文件中分別定義了整數和浮點數的極限。在使用數據類型時,切勿超過其極限,否則會造成程序異常。 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/11/02 */
int main(int argc, char* argv[]) {
printf("int能存儲的最大值是%d\tint能存儲的最小值是%d,占據的字節數量是%d\n \n\n\n", INT_MAX, INT_MIN, sizeof(int));
printf("double能存儲的最大值是%e\t double能存儲的最小值是%e,double占據的字節數量是%d\n \n \n\n", DBL_MAX, DBL_MIN, sizeof(double));
printf("unsigned char 表示的最大值是%d\n", UCHAR_MAX);
//無符號的char存儲的最大值是255 這里超過了最大范圍,輸出的結果不是預期的256,,而且0
unsigned char num = 255 + 1;
printf("num = %d\n", num);
system("pause");
return 0;
}
2.3 常量
任何基本類型都有變量和常量兩種類型。
常量是其值在程序運行期間不能修改,例如小數3.14,字符'a'都是常量,常量之所以不能被修改,是因為常量是在文字常量區。
內存在存儲數據時,考慮到數據不同的用途和特點,把內存存儲區域分為各種區域:棧區、堆區、代碼區、文字常量區、全局區。每個區域的數據類型都有各自的特點。
在日常開發中常用的常量有字符常量、短整型常量、整型常量、長整型常量、單精度浮點型常量以及雙精度浮點型常量。
結合C語言提供的printf函數以及格式符實現格式化輸出常用基本數據類型的常量值
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 日常開發中的基本數據類型的常量 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//%c 用於輸出一個字符,這里輸出字符a
printf("char c= %c \n", 'a');
//%hd用於輸出短整型
printf("short s= %hd \n", 10);
//%d用於輸出整型
printf("int i= %d \n", 100);
//%ld用於輸出長整型
printf("long l= %ld \n", 10000);
//%lld用於輸出長長整型
printf("long ll=%lld \n", 100000000000000000);
//%f用於輸出單精度浮點型
printf("float f= %f", 3.14f);
//%ld用於輸出雙精度浮點型
printf("double d= %lf", 3.14);
//常量一旦定義后不能被修改(賦值)
//10 = 20;
system("pause");
return 0;
}
2.4 變量
2.4.1 變量的本質
生活中隨處可見變量,例如股市的漲跌,游戲人物的武力值都是不斷變化的。
變量就是程序運行時其值可以被修改,而且在定義變量時系統會根據變量類型開辟內存空間,變量可以進行讀寫操作,在同一時刻,內存中的變量只能存儲一份值。如果對變量進行修改,新值會覆蓋舊值。
這里可以通過一段程序結合Visual Studio 2019的調試功能查看內存中值的變化理解變量及其讀寫數據本質。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 變量在內存中的存儲以及讀寫操作的本質 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
int num = 20;
//查看num的內存地址
printf("整數變量num的地址是%p\n", &num);
printf("整數變量num = %d\n", num);
num = 30;
printf("修改之后整數變量num的值是%d\n", num);
system("pause");
return 0;
}
運行程序前,首先設置斷點。
然后啟動程序,查看控制台輸出num的變量地址
然后通過Visual Studio 2019的調試->窗口->內存菜單查看內存,並在地址欄中輸入整數變量num的地址,查看變量值。Visual Studio 2019中查看內存的值默認是一字節,不帶符號,十六進制顯示。
可以通過鼠標右鍵設置成四字節、帶符號顯示。
當程序執行num=30時,內存中的值被修改了
程序運行結果
2.4.2 變量的定義
變量在使用前必須要先定義即聲明並賦初始值,否則會出現編譯錯誤。定義變量時系統會針對變量的類型開辟指定的內存空間。
變量定義的目的是讓變量在系統中存在,變量定義后系統給變量開辟內存空間,變量定義的格式是 類型名+類型名,例如 int number
,number
就是變量名,類型為int,意味着編譯器會針對number
變量開辟4個字節的內存空間。
變量名的本質就是空間內容的別名,操作變量就是操作變量代表的那塊內存空間。
在定義變量時,變量名還要遵守以下的命名規則。
- 變量名由字母、數字、下划線組成。
- 變量名不能以數字開頭。
- 變量名不能是關鍵字,關鍵字是被C語言賦予了特殊的含義,但是可以包含關鍵字,Visual Studio 2019中藍色的都是關鍵字。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 變量的命名規范 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version */
int main(int argc, char* argv[]) {
// 合法的標識符
int number;
//見名知意
int age;
char ch;
double db;
//變量名不能是關鍵字
//int void;
//變量名不能以數字開頭
//int 1num;
/****************************************編譯器特性*******************************/
//VC支持中文變量,GCC不支持中文命名
int 年齡 = 29;
printf("年齡 =%d\n", 年齡);
//在老版(C++11之前)的編譯器中,變量聲明必須放在函數調用之前
/****************************************編譯器特性*******************************/
//聲明多個變量
int one, two, three;
system("pause");
return 0;
}
2.4.3 變量的初始化
變量使用前必須賦值完成初始化,即變量定義時就給變量賦值,例如int age=0;
,否則會發生編譯錯誤:error C4700: 使用了未初始化的局部變量。
定義變量時賦值叫變量的初始化,而定義完成以后再賦值不叫初始化,只是單純的賦值。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 變量的定義 變量的初始化:定義時賦值 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//變量定義的語法 變量類型 變量名
int number;
//變量使用前必須定義並初始化,初始化即定義時給變量賦值,否則會發生編譯錯誤
//printf("number = %d",number);
//定義時賦值叫變量的初始化
int age = 26;
//變量定義
int val;
//定義完成后再賦值就不叫初始化,只是單純的賦值
val = 12;
system("pause");
return 0;
}
在定義變量時可以針對變量的類型賦對應的初始值,例如整數賦值為0,浮點數賦值為0.0,字符類型可以初始化為'\u00'。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 基本數據類型變量的初始化 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//變量初始化時如果類型為整數,推薦初始化為0
int number = 0;
double dbl = 0.0;
//字符型推薦初始化為\u00
char c = '\u00';
system("pause");
return 0;
}
日常開發中通常都是先定義再使用變量,而且通常都需要在定義時初始化即賦值,如果使用了一個沒有賦值的變量,程序會發生編譯錯誤。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 變量使用的注意事項 變量在使用前必須初始化賦值,否則會出現C4700錯誤-> "使用了未初始化的局部變量" @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//聲明一個整數變量並未初始化
int num;
//編譯錯誤錯誤 C4700 使用了未初始化的局部變量“num”
printf("num =%d\n", num);
system("pause");
return 0;
}
2.4.4 變量的聲明
變量的聲明表示告訴編譯器該變量已經存在,此處通過編譯,但是不會再開辟內存空間。
變量的聲明分為自動識別和顯示聲明兩種,日常開發中通常使用自動識別聲明變量。
如果變量定義在使用前面,編譯器可以自動識別變量聲明,因為編譯器在編譯時是從上到下逐語句編譯。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 聲明變量-自動識別 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//編譯器從上到下逐行編譯,
int number = 10; // 變量的定義
//變量的定義在使用之前,此處會自動識別變量的聲明
printf("number = %d \n", number);//變量的使用
system("pause");
return 0;
}
如果變量的定義不再使用的前面,可以使用extern關鍵字顯示聲明變量,在聲明時不用賦值,否則會引發變量“重定義,多次初始化的編譯錯誤”。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 聲明變量-顯示化聲明變量 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
//顯示聲明變量,不用賦值,告訴編譯器在使用到該變量的地方編譯通過
extern int age;
int main(int argc, char* argv[]) {
printf("age = %d", age);
system("pause");
return 0;
}
//變量的定義在使用之后
int age = 26;
但是如果最終變量沒有定義在使用之后,程序運行時還是會出現異常,例如這里如果注釋int age = 26;就會出現 無法解析的外部符號 age。
2.4.5 變量的使用
變量的使用表示對變量的讀寫操作,所謂讀就是獲取變量的值,例如使用printf()輸出變量的值,寫就是賦值以及各種變量的運算,C語言中使用"="表示賦值,賦值是將右邊的值賦值給左邊的變量,也就是操作內存空間。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 變量的讀寫操作 打印輸出就是讀操作 賦值操作就是寫操作 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//變量賦值 就是變量的寫操作
int age = 26;
//printf函數就是對變量的讀操作
printf("age = %d\n ", age);
//=是將右邊的值賦值給左邊的變量
int my_age = age;
//這里也會打印輸出my_age = 26
printf("my_age = %d\n ", my_age);
system("pause");
return 0;
}
除此以外后續還會學習各種運算符,例如算術運算符、自增運算符、邏輯運算符、關系運算符、三元運算符、位運算符等等。
變量的算術運算操作
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 變量的算術運算 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//定義兩個整數變量
int left = 10;
int right = 20;
//計算兩個整數變量相加
int result = left + right;
//輸出兩個整數相加的結果
printf("%d + %d = %d \n", left, right, result);
result = right - left;
//輸出兩個整數相減的結果
printf("%d - %d = %d \n", right, left, result);
system("pause");
return 0;
}
2.5 讀取鍵盤的輸入
之前在定義整數變量並初始化值時只能寫死一個值,整數變量建議初始化時為0,這樣可以避免許多不必要的錯誤出現。
為了讓程序變得更加靈活,這里引入C語言標准庫函數scanf()函數實現基於終端字符界面的人機交互。當然日常應用(例如淘寶、京東)都是基於UI界面實現人機交互,但是底層處理的邏輯是一樣的。
scanf()函數可以從鍵盤中讀取用戶輸入的整數、小數、字符等等,該函數的參數需要傳遞 提取數據格式和變量地址兩個參數,提取數據格式指的就是用戶輸入的數據類型,例如整數、小數等等,變量地址就是&變量名
,&表示地址符號,變量名只能代表空間的內容,通過&變量名
獲取變量對應存儲空間存儲的值。
scanf()函數是阻塞式的,當用戶輸入數據之后,數據會存儲到標准輸入緩存區中,然后scanf()函數負責從標准緩沖區中拿指定格式的數據,如果用戶不輸入數據,那么程序會一直處於阻塞狀態,直到用戶輸入數據后程序繼續往下執行。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/* 使用scanf函數讀取用戶從鍵盤輸入的整數數據 @author liuguanglei ittimelinedotnet@gmail.com @website ittimeline.net @version 2019/10/28 */
int main(int argc, char* argv[]) {
//變量初始化時如果類型為整數,推薦初始化為0
int age = 0;
printf("請輸入你的年齡(按回車鍵結束)\n");//此時程序會進入阻塞狀態
//當用戶輸入數據並回車之后先到達標准輸入緩沖區
//scanf函數負責從標准緩沖區拿整數,此函數是阻塞的,即等到用戶輸入數據才會往下執行
//%d表示提取鍵盤輸入的數字
//變量名僅僅代表變量的內容,如果想要獲取變量的起始地址,需要使用&變量名
scanf("%d", &age);
printf("你的年齡是%d\n", age);
system("pause");
return 0;
}
程序運行結果
2.6 計算機底層為什么只能識別二進制
我們目前主要使用的計算機都是大規模集成電路,是采用大規模和超大規模的集成電路作為邏輯元件的。集成電路按其功能、結構的不同,可以分為模擬集成電路、數字集成電路和數/模混合集成電路三大類。而我們的計算機主要是采用數字集成電路搭建的。邏輯門是數字邏輯電路的基本單元。常見的邏輯門包括“與”門,“或”門,“非”門,“異或”等等。通過邏輯門可以組合使用實現更為復雜的邏輯運算和數值運算。邏輯門可以通過控制高、低電平,從而實現邏輯運算。電源電壓大小的波動對其沒有影響,溫度和工藝偏差對其工作的可靠性影響也比模擬電路小得多,所以相對穩定。因為數字計算機是由邏輯門組成,而邏輯電路最基礎的狀態就是兩個——開和關。所以,數字電路是以二進制邏輯代數為數學基礎。二進制的基本運算規則簡單,運算操作方便,這樣一來有利於簡化計算機內部結構,提高運算速度。但是在日常開發中,通常都會使用八進制和十六進制,因為八進制和十六進制相對於二進制表示數據更加簡潔,而且一個八進制表示三個二進制,一個十六進制表示四個二進制。例如1024使用二進制表示為0b100 0000 0000,使用八進制表示為02000,使用十六進制表示為0x400。
2.7 計算機常用進制及其轉換
2.7.1 進制概述
進制的定義:進制是一種計數方式,也稱為進位計數法或者位值計數法,使用有限數字符號表示無限的數值,使用的數字符號的數目稱為這種進位制的基數或者底數,例如十進制就是由0-9十個數字組成。在計算機內存中,都是以二進制的補碼形式來存儲數據的,生活中以十進制方式計算的數據居多,例如賬戶余額,開發人員的薪水等等。計算的內存地址、MAC地址等等通常都是使用十六進制表示的,Linux系統的權限系統采用八進制的數據表示的。相同進制類型數據進行運算時會遵守加法:逢R進1;減法:借1當R,其中R就表示進制。
計算機常用進制的組成、示例和使用場景
進制名稱 | 組成 | 數值示例 | 應用場景 |
---|---|---|---|
二進制 | 0,1 | 1010 | 計算機底層數據存儲 |
八進制 | 0-7之間的8個整數 | 010 | linux權限系統 |
十進制 | 0-9之間的10個整數 | 12 | 整數 |
十六進制 | 0-9,a-f之間的10個整數加上6個字母 | 12f | 數據的內存地 |
2.7.2 十進制轉換二進制、八進制、十六進制
十進制轉換二進制、八進制、十六進制可以采用短除法,即待轉換的十進制數除以指定的進制(例如2,8,16),直到商數為0,求余數。
十進制101轉換為二進制的計算過程
重復除以2 | 商數 | 余數 |
---|---|---|
101/2 | 50 | 1 |
50/2 | 25 | 0 |
25/2 | 12 | 1 |
12/2 | 6 | 0 |
6/2 | 3 | 0 |
3/2 | 1 | 1 |
1/2 | 0 | 1 |
然后將余數的結果從下到上串聯起來的結果:1100101,即十進制的101轉換為二進制的結果為1100101
十進制的237轉換為二進制
重復除以2 | 商數 | 余數 |
---|---|---|
237/2 | 118 | 1 |
118/2 | 59 | 0 |
59/2 | 29 | 1 |
29/2 | 14 | 1 |
14/2 | 7 | 0 |
7/2 | 3 | 1 |
3/2 | 1 | 1 |
1/2 | 0 | 1 |
然后將余數的結果從下到上串聯起來的結果:11101101,即十進制的237轉換為二進制的結果為11101101。
2.7.3 二進制轉八進制、十六進制
二進制轉八進制是按照從右往左,每3位二進制對應1位八進制,因為2的3次方等於8
二進制整數11001100轉八進制計算過程
11 001 100 =0314
二進制轉十六進制是按照從右往左,每4位二進制對應1位十六進制,因為2的4次方等於16。
二進制整數1100 1110轉十六進制計算過程
1100 1110 =0xce
2.7.4 八進制、十六進制轉二進制
八進制轉二進制是按照從右往左,每1位八進制對應3位二進制。
八進制整數0127轉二進制整數計算過程
0127=001 010 111
十六進制轉二進制是按照從右往左,每1位十六進制對應4位二進制。
十六進制整數0x12f轉換為二進制整數計算過程
0x12f=0001 0010 1111
2.7.5 二進制、八進制、十六進制轉十進制
首先明確不同進制的值是如何計算的,這里以十進制和二進制為例子,闡述它們的計算過程。
十進制整數1024
1024=1*10^3+2*10^1+4*10^0=1000+20+4=1024
二進制整數 10000000000
10000000000 =1*2^10=1024
二進制、八進制、十六進制整數轉十進制整數是使用按權展開法計算的,這里以二進制數據01100101為例子。從右往左開始數,如果二進制位為1,則依次用1*2^n
,n從0開始。
二進制整數01100101 轉換為十進制整數的計算過程
01100101=126+1*25+1*22+1*20=64+32+4+1=101
八進制整數0127轉換為十進制整數的計算過程
0127=1*8^2+2*8^1+7=87
十六進制整數0x12f轉換為十進制整數的計算過程
0x12f=1*16^2+2*16^1+f*16^0=256+32+15=303