理解C 型別的意義

2021-04-13 05:10:58 字數 2678 閱讀 8730

型別的意義

記憶體是分為乙個乙個的基本單元,通常每個基本單元有8位,乙個基本單元叫做1 byte(位元組)。兩個基本單元之間沒有本質上的區別,就好象乙個個同樣大小,同樣形狀,同樣顏色的小箱子。要將基本單元區分開,最直接的方法是將其編號。就好象將箱子排成一列,這是0號箱,這是1號箱,這是2號箱.....記憶體的基本單元也被編號。這個編號就叫做位址。計算機要讀記憶體的時候,首先要先給出個位址,再發出個讀訊號,這個位址裡面的資料就被讀出來了; 同樣要寫記憶體的時候,先寫進乙個位址,再寫進乙個資料,跟著發出個寫訊號,資料就被寫到記憶體。從前面的描述可以知道,記憶體有兩個最最基本的要素,乙個是它的位址(編號),另乙個就是它存放的資料。比如乙個個的箱子,編號用來區分哪乙個箱子,而箱子裡面可放著東西。這時候,大家可以回想起指標的概念,指標本質上就是乙個記憶體單元的編號,只不過這個編號也放在記憶體而已。

好啦。已經知道基本單元可以放1 byte的資料,1 byte其實是很少的,我們所需要的資料很多時候1個基本單元放不下。那怎麼辦? 還用問,分開幾個來放嘛。比如我的資料需要4個位元組來放,這個時候就會產生個問題,怎麼找回我的資料。可能你會說,還用問,用位址嘛,不是有個編號的嗎?沒有錯,是有位址,不過4個位元組有4個位址,你用哪乙個? 最簡單的是, 需要的基本單元位址是連續,用第乙個位址(你也可以用最後乙個位址)來表示, 這第乙個位址叫做起始位址。好,現在再來想一想,光知道資料的起始就可以找回我寶貴的資料了嗎?答案是:不行。比如我有兩個資料,乙個是4位元組,乙個是8位元組,存放之後都得到乙個起始位址,可惜你怎麼知道這個起始位址標明的資料有多少個位元組呢?所以為找回我的資料,除了要知道起始位址,還需要知道資料有多大,也就是size。假如我知道了起始位址為600, 有8個位元組,我就可以理直氣壯地說,從位址為600起,後面我8個位元組都是我的,你們不要亂取哦。所以,型別的第乙個意義就是表明這資料的大小,知道了型別就知道資料的大小,這大小在c++中可以用sizeof得到。

型別有很多,c++中最簡單的型別就有char int double float等,還可以自己來定義。變數,常量都有自己的型別,定義之後就存放在記憶體,變成1001010100之類的二進位制資料,什麼int, 什麼double,什麼string最後都變成二進位制,那怎麼區分呢? 還有資料放在記憶體,**也放在記憶體,怎麼區分呢? 答案很奇妙,對於二進位制數字(其實不單是二進位制),本身是不可區分的,關鍵是看你怎麼去看待,怎麼去處理。同樣乙個二進位制數值,你當成整數來處理,它就是整數,當成浮點數來處理它就是浮點數。同樣的二進位制數值,你執行它時,它就是**,你將它進行運算時,它就是資料。也可以說,同樣的二進位制數值,你想將它當成整數,就用整數的方式去處理它,想將它當成浮點數,就用浮點數的方式去處理它。同樣的數值,想將它當成**,就去執行它,想將它當成資料,就進行運算。概括來說就是,數值本身不可區分,以操作來區分。也可以說數值本身是沒有意義,看你想給他什麼意義。這是乙個很重要的概念,不理解它就很難理解計算機的執行方式。(就我而言,這恐怕是我接觸到的最基本的計算機方面的概念了)

其實這有點涉及到編碼,編碼本身沒有意義,可以區別你要編碼的事物就可以了。比如我有16盞檯燈,也有16臺收音機,對檯燈和收音機進行編號。對於9這個數字,本身沒有意義。不過當我說開啟第9盞檯燈,還說開啟第9臺收音機,這個9就有意義了。不過我用openlamp和openradio來表示開啟檯燈和開啟收音機兩個操作,發出兩條指令openlamp 9, openradio 9, 你也知道如何做。要是我將openlamp改為操作1,openradio該為操作2,我說 操作1 9, 操作2 9,你有知道怎麼做。連操作兩字都去掉,就變成1 9, 2 9, 同樣也知道我想做什麼。現在我有個約定,將它化成2進製,頭兩個位表示操作,後4個位表示編號。那麼說開啟第9盞檯燈,說開啟第9臺收音機,就分別是011001, 101001。將上面的二進位制數值看成所謂的**,你就能正確的開啟檯燈和收音機。

原則上,什麼整數,什麼浮點數只不過是個編號,用編號來區分不同的整數,不同的浮點數。當我們說9的時候,是沒有意義的,不過用add來表示整數想加,用fadd來表示浮點數相加。9 add 10 表示一種操作,將編號為9的那個整數和編號為10的那個整數進行相加。另外9 fadd 10也表示一種操作,將編號為9的那個浮點數和編號為10的浮點數相進行相加。至於編號為9,為10的整數,編號為9,為10的浮點數到底是什麼,就要看你怎麼編碼了。有些編碼方式確實比其他方式要合理,有效,那就多人使用,當成預設,就成了標準了。現在無符號整數,有符號整數,浮點數如何編碼都有自己的標準。

廢話說了這樣多,我們可以得到型別的第二個意義。以型別來指示如何操作放在記憶體的數值。

概括起來,型別的意義有兩個

1)指明資料的大小,以便正確分配,訪問,**記憶體。

2)對本質上不可區分的記憶體資料進行不同的操作。

至於檢查語法錯誤之類,不是型別最基本的意義。應該說,正因為有這兩個意義,才有必要進行型別檢查。

#include 

using namespace std;

int main()

;char *pchar = (char*)(&chs);

short *pshort = (short*)(&chs);

int *pint = (int*)(&chs);

float *pfloat = (float*)(&chs);

cout<<*pchar

}比如同樣的資料'a', 'b', 'c', 'd'存放之後變成二進位製碼,跟著將那些數值當成不同的型別,可以得出不同的輸出。你也可以用printf, printf裡面的%d, %s, %f之類的引數,就是用來指示你想將資料當成什麼型別,以便進行不同的輸出。

理解C 的Lock語法意義

一.為什麼要lock,lock了什麼?當我們使用執行緒的時候,效率最高的方式當然是非同步,即各個執行緒同時執行,其間不相互依賴和等待。但當不同的執行緒都需要訪問某個資源的時候,就需要同步機制了,也就是說當對同乙個資源進行讀寫的時候,我們要使該資源在同一時刻只能被乙個執行緒操作,以確保每個操作都是有效...

C 型別理解

1.值型別2.引用型別,c 中所有的類都是引用型別 所有的引用型別的例項都分配在託管堆上,c 中new操作符會返回乙個記憶體位址指向當前的物件。所以當你在建立個乙個引用型別例項的時候,你必須要考慮以下問題 在類例項化之前不能引用,除非是靜態類 csharp public class examplem...

理解C 的string型別

有關c string型別究竟是值型別還是引用型別,在很多c 學習者中都或多或少造成過困惑,多數是因為這個情況 string a aaa string b a b bbb 或者是這麼幾行 public void swap string s1,string s2 string temp s1 s1 s2...