【嵌入式修煉之路】- C語言第一課之數據類型

學益得線上課堂
從基礎學習嵌入式
玩轉智能硬件、斬獲高薪offer

爲什麼學習C語言

學習嵌入式的第一步必須要搞懂C語言,不管後面是從事硬件開發、還是底層開發、還是應用開發,都離不開C語言。C語言效率高是一個根本原因,毫不誇張的說,沒有C語言,就沒有計算機,沒有現在我們能看到的一切智能電子設備。

前面專門有文章講解了C語言在工作中的實際應用,大家可以閱讀下。

詳細盤點C語言在工作中的實際應用

C語言學習路線

C語言的學習需要從基本的數據類型學起,類容很多,包括運算符、表達式、數組、指針、函數、內存管理等等,在這裏也給大家詳細總結了一下。

學益得智能硬件-C語言學習路線

數據類型

C語言在運行的過程中需要保存數據,保存數據就需要內存,需要多大的內存呢?於是C語言就造出了數據類型的概念,不同的數據類型佔用不同大小的內存空間,比如你想保存一個整數,編譯器就給你分配4個字節,你想保存一個字符,編譯器就給你分配1個字節。

數據類型分類

數據類型的分類沒有固定的標準,我這裏暫且把他們分爲兩類,基本數據類型和複合數據類型。

在這裏插入圖片描述

  • 空類型:void 一般用於函數的返回值;
  • 字符型:char 比如我們常見的字母,‘a’、‘b’、‘c’等等,字符在C語言中用單引號表示;
  • 數值型:int 用來表示常見的數字,1、2、3等等;
  • 短整型:short 短整型一般來說,表示的範圍比int小;
  • 長整型:long 長整型一般來說,表示的範圍比整型長(注意一般,比如32位操作系統就是一樣長);
  • 浮點型:float 可以表示小數,精確到小數點後6位;
  • 雙精度浮點型:double 可以表示小數,表示的範圍比float更大,精確到小數點後15位。

字符型數據和數值型數據都有符號之分,分爲有符號和無符號。所謂有符號,就是既能表示整數也能表示負數。所謂無符號數,只能表示正數。

int a;             //等價於 signed int a; 定義一個有符號的整數
unsigned int b;    //定義無符號整數b,b只能用於保存正數
char c;            //等價於 signed char c; 定義有符號字符
unsigned char d;   //定義無符號字符

字符爲什麼還有符號一說?難道還有‘-a‘這個東西嗎?

這得從字符在內存中的表示說起。計算機只能識別二進制,就是高低電平(要麼有電、要麼沒電)。所以內存裏面保存的數據要麼是1,要麼是0。但是這樣的話字符’a‘就沒法表示了,他跟數字沒有關係,不能轉換成二進制。於是就想了一個方法,把’a‘轉換成數字,就是所謂的ASC碼。可以理解成,每個字符都對應一個數字,比如’a‘對應的是97,所以’a‘在內存裏面的存儲就是數字97,只不過’a‘是用一個字節來表示97,整數97是用四個字節表示。

ASCII碼錶

複合數據類在這不做過多解釋,後面都會作爲一個專題來講。

數據類型長度

每個數據類型長度必須搞清楚,筆試的重點內容,雖然不會直接問你char佔幾個字節,但是會放在結構體裏面考查。涉及到兩個知識點:

  1. 數據類型長度
  2. 數據表示範圍

數據類型長度在不同的操作系統上略微有不同,大部分情況下都是按照32位操作系統計算。如何判斷數據類型長度?sizeof可以解決。

#include <stdio.h>

int main()
{
    printf("%ld\n", sizeof(char));    //sizeof是關鍵字,不是函數,用於求數據類型的長度
    printf("%ld\n", sizeof(int));
    printf("%ld\n", sizeof(short));
    printf("%ld\n", sizeof(long));
    printf("%ld\n", sizeof(float));
    printf("%ld\n", sizeof(double));
    
    return 0;
}

在32位操作系統裏面,結果是char 1字節,short 2字節,int 4字節,long 4字節,float 4字節,double 8字節,64位操作系統略有不同,比如long 8字節。

字節是什麼?內存是以字節爲單位,就像教學樓一樣,以教室爲單位,每個教室都有一個門牌號。內存也是,每個字節都有一個地址,一個整數會佔用4個地址。每個字節由8位二進制數組成,就像每間教室有8個作爲一樣,每個座位有兩種狀態,要麼有人,要麼沒人。

下面嘗試着計算類型【char】能表示的範圍。

char在內存中佔1個字節,每個字節由8位二進制數組成。

在這裏插入圖片描述
先來研究無符號char,無符號char的8位全部用來表示數值,於是得到最大值:

在這裏插入圖片描述

對這個數值加1,得到100000000,即2^8,256,減一,得到255。無符號char能表示的最大數就是255。

最小數:

在這裏插入圖片描述

無符號char能表示的最小數0。

再考慮有符號的情況。有符號數,最高位用來表示符號位, 0表示正數,1表示負數。 於是得到最大數:

在這裏插入圖片描述
這個數字是 128 - 1 = 127,有符號字符能表示的最大數是127。

最小數肯定是負數,所以第一位應該是1。於是很多同學誤以爲,最小數:

在這裏插入圖片描述
這個數字是-127。所以有符號char能表示的範圍是-127到127?顯示不是,0到255可以表示256個整數,-127到+127能表示255個整數,明顯少了一個,原因在於:

在這裏插入圖片描述
這兩個數字重複了,一個是-0,一個是+0。所以在計算機中,0的表示應該是:

在這裏插入圖片描述

如果寫成這樣:

在這裏插入圖片描述

表示最小數-128。所以有符號char能表示的範圍 -128 到 127。

關於數據類型,最重要的還是要搞清楚數據在內存裏面是怎麼存放的,比如負數在內存中以補碼形式存儲。下面計算一下在 char 類型中,爲什麼 -128 - 1 = 127 ?

-128的二進制 10000000,先計算反碼, 11111111,再計算補碼(反碼加1) 10000000,符號位保持不變,其實相當於是越界了,超過了8位,所以最高位1去掉。同理可得 -1 的補碼。

在這裏插入圖片描述

最終的結果是 101111111,因爲char只有1個字節,只有8位,所以最高位去掉,結果是 01111111,即127。

最後給大家留一個微軟經典的筆試題:

unsigned int a = 3;

a * -1 = ?             //不僅涉及到負數在內存的存儲,還涉及到混合運算

更多文章、視頻、嵌入式學習資源,微信關注 【學益得智能硬件】。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章