計(jì)算機(jī)的計(jì)算單位容量單位在購買電腦時(shí),通常會(huì)選擇高配置的內(nèi)存、硬盤。例如2019款15寸的MacBookPro已經(jīng)可以選配32G內(nèi)存和4T的固態(tài)硬盤,而這里的32G和4T就是計(jì)算機(jī)常用的容量單位。 在物理層面,我們使用高低電平來記錄信息,通常使用高電平表示1,低電平表示0,因此在計(jì)算機(jī)底層只能認(rèn)識0,1兩種狀態(tài)。而0,1能夠表示的內(nèi)容太少,迫切需要更大的容量表示方法,因此誕生了字節(jié)(Byte),千字節(jié)(KB),兆字節(jié)(MB),吉字節(jié)(GB),太字節(jié)(TB),拍字節(jié)(PB),艾字節(jié)(EB),除了bit和Byte之外,從Byte到KB,MB,GB,TB,PB,EB,它們的換算都是以2的10次方即1024換算的。
現(xiàn)在通常筆記本的內(nèi)存通常是8G,16G,32G,64G等等,而運(yùn)行在筆記本之上的操作系統(tǒng)普遍都是64位的,因?yàn)?2位系統(tǒng)只能使用4G內(nèi)存,下面是4G的內(nèi)存換算 在購買內(nèi)存或者買移動(dòng)硬盤時(shí),通常使用的存儲單位就是GB或者是TB,但是在買4T的移動(dòng)硬盤時(shí),實(shí)際的可用容量卻只有3T多,因?yàn)橛?jì)算機(jī)的存儲單位是以2的10次方(即1024)換算,而硬盤廠商們是以1000為換算單位。 4T的硬盤換算成位如下所示 而硬盤廠商的實(shí)際容量 因此實(shí)際的可用容量是 而在一些互聯(lián)網(wǎng)巨頭(例如國內(nèi)的BAT,國外的亞馬遜、蘋果、微軟、谷歌,臉書)公司中,可能使用到比TB更大的海量數(shù)據(jù),也就是PB或者EB,它們的換算單位如下所示。 速度單位
數(shù)據(jù)類型數(shù)據(jù)為什么要分類數(shù)據(jù)類型就是給數(shù)據(jù)分類,其目的就是合理的利用計(jì)算機(jī)的內(nèi)存空間,提高存儲效率。類型是抽象的概念,類型有大小,但是沒有空間,系統(tǒng)不會(huì)給類型分配空間,但是會(huì)給類型定義的變量分配空間,例如定義變量 int age =28;時(shí)系統(tǒng)會(huì)給age變量分配四個(gè)字節(jié)的空間。不同的數(shù)據(jù)類型占據(jù)不同的內(nèi)存大小,其存儲數(shù)據(jù)的極限也不一樣、能夠執(zhí)行的運(yùn)算也是不相同的。 C語言常用基本數(shù)據(jù)類型C語言中基本數(shù)據(jù)類型有整型、浮點(diǎn)型、字符型,布爾型。其他的類型都是由基本數(shù)據(jù)類型封裝而來的。 其中整數(shù)按照不同的字節(jié)大小有short,int,long,long long,其中l(wèi)ong long 是C99標(biāo)準(zhǔn)支持。浮點(diǎn)數(shù)按照精度不同有float,double,其中float表示單精度浮點(diǎn)型,double表示雙精度浮點(diǎn)型。字符只有char表示,用于存儲單個(gè)字符。布爾使用bool表示,C語言中的0表示false,1表示true。 sizof關(guān)鍵字查看數(shù)據(jù)類型占據(jù)的內(nèi)存容量C語言提供了提供了sizeof()關(guān)鍵字來獲取數(shù)據(jù)類型占據(jù)的內(nèi)存空間。sizeof()中可以傳數(shù)據(jù)類型名或者變量名,當(dāng)傳遞變量名實(shí)際上是求變量類型的大小。 需要注意的是C語言相同的數(shù)據(jù)類型在不同的操作系統(tǒng)環(huán)境下占據(jù)的空間是不一樣的。在Visual Studio 2019中集成了32位編譯器和64位編譯器,C程序默認(rèn)是以32位運(yùn)行( https://link.zhihu.com/?target=https%3A//jq.qq.com/%3F_wv%3D1027%26k%3D5n2xgg8 )的。C語言核心技術(shù)-變量和數(shù)據(jù)類型 32位:sizeof()關(guān)鍵字的運(yùn)行結(jié)果C語言核心技術(shù)-變量和數(shù)據(jù)類型 如果想要切換到64位下運(yùn)行,只需要將X86換成x64即可C語言核心技術(shù)-變量和數(shù)據(jù)類型 64位:sizeof()關(guān)鍵字的運(yùn)行結(jié)果C語言核心技術(shù)-變量和數(shù)據(jù)類型 在Windows平臺下long類型無論是在32位還是64位都是占據(jù)四個(gè)字節(jié),而Linux(Ubuntu18.04)則是占據(jù)8個(gè)字節(jié)。Ubuntu18.04下sizeof()關(guān)鍵字測試 程序運(yùn)行結(jié)果C語言核心技術(shù)-變量和數(shù)據(jù)類型 數(shù)據(jù)的有符號和無符號有符號表示數(shù)據(jù)有正負(fù)之分,數(shù)值二進(jìn)制的最高位(左邊第一位)為符號位,0表示整數(shù),1表示負(fù)數(shù),其他位為負(fù)數(shù)。以兩個(gè)字節(jié)的數(shù)據(jù)1為例子,其二進(jìn)制表示為0000 0000 0000 0001,因?yàn)槭钦龜?shù),因此最高位是0,-1的二進(jìn)制表示為1000 0000 0000 0001( https://link.zhihu.com/?target=https%3A//jq.qq.com/%3F_wv%3D1027%26k%3D5n2xgg8 ),因?yàn)槭秦?fù)數(shù),因此最高位是1。無符號數(shù)表示數(shù)據(jù)沒有正負(fù)之分,全是正數(shù)(即大于等于0的數(shù)),無符號數(shù)沒有符號位,全是數(shù)據(jù)位。以兩個(gè)字節(jié)的數(shù)據(jù)1為例子,其二進(jìn)制表示為0000 0000 0000 0001。 C語言中的整數(shù)常量默認(rèn)都是有符號的,如果要使用無符號的常量,需要在常量值后面添加U后綴。C語言中的整數(shù)變量默認(rèn)都是有符號的,如果要使用無符號的變量,需要在變量類型前面加上unsigned關(guān)鍵字。 有符號整數(shù)常量和無符號整數(shù)常量 有符號和無符號變量 數(shù)據(jù)類型的極限數(shù)據(jù)類型都有其存儲范圍(即存儲的最大值和最小值),C語言中的limits.h和float.h頭文件中分別定義了整數(shù)和浮點(diǎn)數(shù)的極限。在使用數(shù)據(jù)類型時(shí),切勿超過其極限,否則會(huì)造成程序異常。 常量任何基本類型都有變量和常量兩種類型。常量是 其值在程序運(yùn)行期間不能修改 ,例如小數(shù)3.14,字符'a'都是常量,常量之所以不能被修改,是因?yàn)槌A渴窃谖淖殖A繀^(qū)。內(nèi)存在存儲數(shù)據(jù)時(shí),考慮到數(shù)據(jù)不同的用途和特點(diǎn),把內(nèi)存存儲區(qū)域分為各種區(qū)域:棧區(qū)、堆區(qū)、代碼區(qū)、文字常量區(qū)、全局區(qū)。每個(gè)區(qū)域的數(shù)據(jù)類型都有各自的特點(diǎn)。 在日常開發(fā)中常用的常量有字符常量、短整型常量、整型常量、長整型常量、單精度浮點(diǎn)型常量以及雙精度浮點(diǎn)型常量。 結(jié)合C語言提供的printf函數(shù)以及格式符實(shí)現(xiàn)格式化輸出常用基本數(shù)據(jù)類型的常量值 變量變量的本質(zhì)生活中隨處可見變量,例如股市的漲跌,游戲人物的武力值都是不斷變化的。變量就是程序運(yùn)行時(shí)其值可以被修改,而且在定義變量時(shí)系統(tǒng)會(huì)根據(jù)變量類型開辟內(nèi)存空間,變量可以進(jìn)行讀寫操作,在同一時(shí)刻,內(nèi)存中的變量只能存儲一份值。如果對變量進(jìn)行修改,新值會(huì)覆蓋舊值。 這里可以通過一段程序結(jié)合Visual Studio 2019的調(diào)試功能查看內(nèi)存中值的變化理解變量及其讀寫數(shù)據(jù)本質(zhì)。 運(yùn)行程序前,首先設(shè)置斷點(diǎn)。C語言核心技術(shù)-變量和數(shù)據(jù)類型 然后啟動(dòng)程序,查看控制臺輸出num的變量地址然后通過Visual Studio 2019的調(diào)試->窗口->內(nèi)存菜單查看內(nèi)存,并在地址欄中輸入整數(shù)變量num的地址,查看變量值。Visual Studio 2019中查看內(nèi)存的值默認(rèn)是一字節(jié),不帶符號,十六進(jìn)制顯示。 C語言核心技術(shù)-變量和數(shù)據(jù)類型 可以通過鼠標(biāo)右鍵設(shè)置成四字節(jié)、帶符號顯示。 C語言核心技術(shù)-變量和數(shù)據(jù)類型 當(dāng)程序執(zhí)行num=30時(shí),內(nèi)存中的值被修改了 C語言核心技術(shù)-變量和數(shù)據(jù)類型 程序運(yùn)行結(jié)果C語言核心技術(shù)-變量和數(shù)據(jù)類型 變量的定義變量在使用前必須要先定義 即聲明并賦初始值 ,否則會(huì)出現(xiàn)編譯錯(cuò)誤。定義變量時(shí)系統(tǒng)會(huì)針對變量的類型開辟指定的內(nèi)存空間。 變量定義的目的是讓變量在系統(tǒng)中存在,變量定義后系統(tǒng)給變量開辟內(nèi)存空間,變量定義的格式是 類型名+類型名,例如 int number,number就是變量名,類型為int,意味著編譯器會(huì)針對number變量開辟4個(gè)字節(jié)的內(nèi)存空間。變量名的本質(zhì)就是空間內(nèi)容的別名,操作變量就是操作變量代表的那塊內(nèi)存空間。 在定義變量時(shí),變量名還要遵守以下的命名規(guī)則。
變量的初始化變量使用前必須賦值完成初始化,即變量定義時(shí)就給變量賦值,例如int age=0;,否則會(huì)發(fā)生編譯錯(cuò)誤:error C4700: 使用了未初始化的局部變量。定義變量時(shí)賦值叫變量的初始化,而定義完成以后再賦值不叫初始化,只是單純的賦值。 在定義變量時(shí)可以針對變量的類型賦對應(yīng)的初始值,例如整數(shù)賦值為0,浮點(diǎn)數(shù)賦值為0.0,字符類型可以初始化為'\\u00'。 日常開發(fā)中通常都是先定義再使用變量,而且通常都需要在定義時(shí)初始化即賦值,如果使用了一個(gè)沒有賦值的變量,程序會(huì)發(fā)生編譯錯(cuò)誤。 變量的聲明變量的聲明表示告訴編譯器該變量已經(jīng)存在,此處通過編譯,但是不會(huì)再開辟內(nèi)存空間。變量的聲明分為自動(dòng)識別和顯示聲明兩種,日常開發(fā)中通常使用自動(dòng)識別聲明變量。如果變量定義在使用前面,編譯器可以自動(dòng)識別變量聲明,因?yàn)榫幾g器在編譯時(shí)是從上到下逐語句編譯。 如果變量的定義不再使用的前面,可以使用extern關(guān)鍵字顯示聲明變量,在聲明時(shí)不用賦值,否則會(huì)引發(fā)變量“重定義,多次初始化的編譯錯(cuò)誤”。 但是如果最終變量沒有定義在使用之后,程序運(yùn)行時(shí)還是會(huì)出現(xiàn)異常,例如這里如果注釋int age = 26;就會(huì)出現(xiàn) 無法解析的外部符號 age。 變量的使用變量的使用表示對變量的讀寫操作,所謂讀就是獲取變量的值,例如使用printf()輸出變量的值,寫就是賦值以及各種變量的運(yùn)算,C語言中使用"="表示賦值,賦值是將右邊的值賦值給左邊的變量,也就是操作內(nèi)存空間。 除此以外后續(xù)還會(huì)學(xué)習(xí)各種運(yùn)算符,例如算術(shù)運(yùn)算符、自增運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、三元運(yùn)算符、位運(yùn)算符等等。 變量的算術(shù)運(yùn)算操作 讀取鍵盤的輸入之前在定義整數(shù)變量并初始化值時(shí)只能寫死一個(gè)值,整數(shù)變量建議初始化時(shí)為0,這樣可以避免許多不必要的錯(cuò)誤出現(xiàn)。為了讓程序變得更加靈活,這里引入C語言標(biāo)準(zhǔn)庫函數(shù)scanf()函數(shù)實(shí)現(xiàn)基于終端字符界面的人機(jī)交互。當(dāng)然日常應(yīng)用(例如淘寶、京東)都是基于UI界面實(shí)現(xiàn)人機(jī)交互,但是底層處理的邏輯是一樣的。 scanf()函數(shù)可以從鍵盤中讀取用戶輸入的整數(shù)、小數(shù)、字符等等,該函數(shù)的參數(shù)需要傳遞 提取數(shù)據(jù)格式和變量地址 兩個(gè)參數(shù),提取數(shù)據(jù)格式指的就是用戶輸入的數(shù)據(jù)類型,例如整數(shù)、小數(shù)等等,變量地址就是&變量名,&表示地址符號,變量名只能代表空間的內(nèi)容,通過&變量名獲取變量對應(yīng)存儲空間存儲的值。scanf()函數(shù)是阻塞式的,當(dāng)用戶輸入數(shù)據(jù)之后,數(shù)據(jù)會(huì)存儲到標(biāo)準(zhǔn)輸入緩存區(qū)中,然后scanf()函數(shù)負(fù)責(zé)從標(biāo)準(zhǔn)緩沖區(qū)中拿指定格式的數(shù)據(jù),如果用戶不輸入數(shù)據(jù),那么程序會(huì)一直處于阻塞狀態(tài),直到用戶輸入數(shù)據(jù)后程序繼續(xù)往下執(zhí)行。 程序運(yùn)行結(jié)果C語言核心技術(shù)-變量和數(shù)據(jù)類型 計(jì)算機(jī)常用進(jìn)制及其轉(zhuǎn)換計(jì)算機(jī)底層為什么只能識別二進(jìn)制我們目前主要使用的計(jì)算機(jī)都是大規(guī)模集成電路,是采用大規(guī)模和超大規(guī)模的集成電路作為邏輯元件的。集成電路按其功能、結(jié)構(gòu)的不同,可以分為模擬集成電路、數(shù)字集成電路和數(shù)/?;旌霞呻娐啡箢?。而我們的計(jì)算機(jī)主要是采用數(shù)字集成電路搭建的。邏輯門是數(shù)字邏輯電路的基本單元。常見的邏輯門包括“與”門,“或”門,“非”門,“異或”等等。通過邏輯門可以組合使用實(shí)現(xiàn)更為復(fù)雜的邏輯運(yùn)算和數(shù)值運(yùn)算。邏輯門可以通過控制高、低電平,從而實(shí)現(xiàn)邏輯運(yùn)算。電源電壓大小的波動(dòng)對其沒有影響,溫度和工藝偏差對其工作的可靠性影響也比模擬電路小得多,所以相對穩(wěn)定。因?yàn)閿?shù)字計(jì)算機(jī)是由邏輯門組成,而邏輯電路最基礎(chǔ)的狀態(tài)就是兩個(gè)——開和關(guān)。所以,數(shù)字電路是以二進(jìn)制邏輯代數(shù)為數(shù)學(xué)基礎(chǔ)。二進(jìn)制的基本運(yùn)算規(guī)則簡單,運(yùn)算操作方便,這樣一來有利于簡化計(jì)算機(jī)內(nèi)部結(jié)構(gòu),提高運(yùn)算速度。但是在日常開發(fā)中,通常都會(huì)使用八進(jìn)制和十六進(jìn)制,因?yàn)榘诉M(jìn)制和十六進(jìn)制相對于二進(jìn)制表示數(shù)據(jù)更加簡潔,而且一個(gè)八進(jìn)制表示三個(gè)二進(jìn)制,一個(gè)十六進(jìn)制表示四個(gè)二進(jìn)制。例如1024使用二進(jìn)制表示為0b100 0000 0000,使用八進(jìn)制表示為02000,使用十六進(jìn)制表示為0x400。 進(jìn)制概述進(jìn)制的定義:進(jìn)制是一種計(jì)數(shù)方式,也稱為進(jìn)位計(jì)數(shù)法或者位值計(jì)數(shù)法,使用有限數(shù)字符號表示無限的數(shù)值,使用的數(shù)字符號的數(shù)目稱為這種進(jìn)位制的基數(shù)或者底數(shù),例如十進(jìn)制就是由0-9十個(gè)數(shù)字組成。在計(jì)算機(jī)內(nèi)存中,都是以二進(jìn)制的補(bǔ)碼形式來存儲數(shù)據(jù)的,生活中以十進(jìn)制方式計(jì)算的數(shù)據(jù)居多,例如賬戶余額,開發(fā)人員的薪水等等。計(jì)算的內(nèi)存地址、MAC地址等等通常都是使用十六進(jìn)制表示的,Linux系統(tǒng)的權(quán)限系統(tǒng)采用八進(jìn)制的數(shù)據(jù)表示的。相同進(jìn)制類型數(shù)據(jù)進(jìn)行運(yùn)算時(shí)會(huì)遵守加法:逢R進(jìn)1;減法:借1當(dāng)R,其中R就表示進(jìn)制。 計(jì)算機(jī)常用進(jìn)制的組成、示例和使用場景 十進(jìn)制轉(zhuǎn)換二進(jìn)制、八進(jìn)制、十六進(jìn)制十進(jìn)制轉(zhuǎn)換二進(jìn)制、八進(jìn)制、十六進(jìn)制可以采用短除法,即待轉(zhuǎn)換的十進(jìn)制數(shù)除以指定的進(jìn)制(例如2,8,16),直到商數(shù)為0,求余數(shù)。 十進(jìn)制101轉(zhuǎn)換為二進(jìn)制的計(jì)算過程 然后將余數(shù)的結(jié)果從下到上串聯(lián)起來的結(jié)果:1100101,即十進(jìn)制的101轉(zhuǎn)換為二進(jìn)制的結(jié)果為1100101 十進(jìn)制的237轉(zhuǎn)換為二進(jìn)制 然后將余數(shù)的結(jié)果從下到上串聯(lián)起來的結(jié)果:11101101,即十進(jìn)制的237轉(zhuǎn)換為二進(jìn)制的結(jié)果為11101101。 二進(jìn)制轉(zhuǎn)八進(jìn)制、十六進(jìn)制二進(jìn)制轉(zhuǎn)八進(jìn)制是按照從右往左,每3位二進(jìn)制對應(yīng)1位八進(jìn)制,因?yàn)?的3次方等于8 二進(jìn)制整數(shù)11001100轉(zhuǎn)八進(jìn)制計(jì)算過程 二進(jìn)制轉(zhuǎn)十六進(jìn)制是按照從右往左,每4位二進(jìn)制對應(yīng)1位十六進(jìn)制,因?yàn)?的4次方等于16。 二進(jìn)制整數(shù)1100 1110轉(zhuǎn)十六進(jìn)制計(jì)算過程 八進(jìn)制、十六進(jìn)制轉(zhuǎn)二進(jìn)制八進(jìn)制轉(zhuǎn)二進(jìn)制是按照從右往左,每1位八進(jìn)制對應(yīng)3位二進(jìn)制。 八進(jìn)制整數(shù)0127轉(zhuǎn)二進(jìn)制整數(shù)計(jì)算過程 十六進(jìn)制轉(zhuǎn)二進(jìn)制是按照從右往左,每1位十六進(jìn)制對應(yīng)4位二進(jìn)制。 十六進(jìn)制整數(shù)0x12f轉(zhuǎn)換為二進(jìn)制整數(shù)計(jì)算過程 二進(jìn)制、八進(jìn)制、十六進(jìn)制轉(zhuǎn)十進(jìn)制首先明確不同進(jìn)制的值是如何計(jì)算的,這里以十進(jìn)制和二進(jìn)制為例子,闡述它們的計(jì)算過程。 十進(jìn)制整數(shù)1024 二進(jìn)制整數(shù) 10000000000 二進(jìn)制、八進(jìn)制、十六進(jìn)制整數(shù)轉(zhuǎn)十進(jìn)制整數(shù)是使用按權(quán)展開法計(jì)算的,這里以二進(jìn)制數(shù)據(jù)01100101為例子。從右往左開始數(shù),如果二進(jìn)制位為1,則依次用1*2^n,n從0開始。 二進(jìn)制整數(shù)01100101 轉(zhuǎn)換為十進(jìn)制整數(shù)的計(jì)算過程 八進(jìn)制整數(shù)0127轉(zhuǎn)換為十進(jìn)制整數(shù)的計(jì)算過程 十六進(jìn)制整數(shù)0x12f轉(zhuǎn)換為十進(jìn)制整數(shù)的計(jì)算過程 |
|