C語言核心技術-變量和數據類型

C語言核心技術-變量和數據類型

2.1 計算機的計算單位

2.1.1 容量單位

在購買電腦時,一般會選擇高配置的內存、硬盤。例如2019款15寸的MacBookPro已經能夠選配32G內存和4T的固態硬盤,而這裏的32G和4T就是計算機經常使用的容量單位。html

在物理層面,咱們使用高低電平來記錄信息,一般使用高電平表示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換算的。linux

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的內存換算web

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/10243.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。ui

  • CPU速度
    CPU的速度通常是由CPU的時鐘頻率所體現的,而時鐘頻率的單位是赫茲(Hz),目前主流的CPU時鐘頻率通常都在2GHz以上,而赫茲(Hz)其實就是秒分之一,也就是每秒鐘的週期性變更重複次數的計量。
    GHz即十億赫茲(10^9Hz),2GHz就是二十億赫茲,也就是說2GHz的CPU每秒能夠變化20億次。spa

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位運行的。
X86表示32位

32位:sizeof()關鍵字的運行結果
32位 sizeof()關鍵字

若是想要切換到64位下運行,只須要將X86換成x64便可
X64運行

64位:sizeof()關鍵字的運行結果
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;
}

程序運行結果
Ubuntu18.04下sizeof()關鍵字測試

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
相關文章
相關標籤/搜索