最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

非常規(guī)入門C語言:2、初始數據類型

2023-06-13 23:08 作者:嬴寒  | 我要投稿

日常生活中,在我們周圍充斥著各種各樣的數據。這些數據有著不同的形式,且分布在不同的載體上。

但有些數據是有意義的,如費用余額、學號、身份證號、姓名、年齡等;而有些數據是無意義的,如......

而計算機被發(fā)明以來,天生就是服務于科學計算的,即:一切計算機問題都是數學問題。

上一章中,計算機底層的計算方式是通過二進制來確定的。同時為了能夠方便地使數據參與運算,還引出最小處理寬度(寬度就二進制位數)和控制指令。

那我們可以把哪些數據放在計算機“里面”呢?

理論上,所有數據都可以。但首先我們解決數據從哪里來的問題,即信息的數字化。

首先,和數值相關的東西,我們可以很方便存儲在計算機中,剩下的問題就是精度和寬度的問題。

其次,我們還需要解決非數值信息的數字化問題。

那么我們先解決哪個問題呢?

為了避免問題的延伸,我們先解決寬度的問題,即給不同的數據分配一個確定的類型,即數據類型。

首先,我們能確定的第一個數據類型就是計算機的最小處理寬度,無論是哪種機器,無論它的最小處理寬度是多大,我們都稱之為“字”,字的寬度稱之為“字寬”。那么為了和二進制搭上關系,我們采用倍數增長的方式,擴大數據類型的表示范圍。

字->雙字->四字->八字->16字->32字->64字......

你想擴大多少倍都可以,但必須是前一個數值的2倍。因為這樣的處理方式的難度是最低的。

于是,基于“字”概念的數據類型就出現(xiàn)了。但是它本身并不具有通用性和實際意義,因為“無論它的最小處理寬度是多大,我們都稱之為‘字’”。

這時,我們應該想到貌似有一個8位的數據。沒錯,在上一章中,我們使用8位二進制的數據完整表示了控制字符(如換行等)、大小寫字母、數字常用標點符號。那么,干脆就用8位作為最小處理寬度。

那么,給個名字,把8位寬度的稱為“字節(jié)”,同時將“字節(jié)”確定為通用的基本字寬。

這時,我們得到了一些較為原始的數據類型:字節(jié)、雙字節(jié)、四字節(jié)......

我們能有多大的數呢。。。這是一個問題。因為需要看CPU能處理多大的數。32位的CPU最大一次性處理32位,64位CPU最大一次性處理64位。為啥是一次性呢?理論上來說,只要你能提供足夠的存儲空間,數字多大都沒問題,但是運算是一部分一部分來的,極端情況也有可能是一位一位來計算的。這種由CPU確定的最大一次性處理寬度,稱之為“數據寬度”。

早期計算機的數據類型就是這樣。。。很枯燥,很直白,但也很簡約。

但這不是我們的目標,我們的目標是“星辰大?!薄?/p>

1 + 1 = 2

1 - 2 = ?

當你在計算時有沒有想到這樣一個問題:正整數可以直接表示,但負整數和小數沒辦法直接在計算機中表示。

因為計算機中沒有負號和小數點的概念。解決辦法也是相當簡單粗暴:用正整數來表示不就好了?

舉個例子

使用字節(jié)來控制字寬。那最長就是8位,表示的范圍就是0到255(即0000 0000 ~ 1111 1111)。

首先我們先確定一下正數與負數的交界點,那就是0。那我們就可以確定,0加上1就是正數,0減掉1就是負數。

如果我們需要表達-2,那就是0000 0000 - 0000 0010就等于1111 1110,因為0減1不足,向前借2。

那么,教科書里是怎樣教的呢?

嬴寒隱約記得,取反碼再加1。。其實很簡單,根本用不著反碼。所謂反碼,只是計算機的一種取反運算而已,因為相比加減運算,取反的操作,那簡直是太快了,瞬時就可以完成。

為什么是瞬時呢?因為只需要對前面的位進行取反,最低位根本不用管就可以完成一個負數的完整表達。根本不可能使用加減運算。但作為人類,我們有時有必要理解計算機的運算方式,但有時又沒有必要。而像這種特別基礎,基礎到對后面的知識沒有什么太大影響的東西,我們只需要理解最人性化的思路就可以了。

但是教科書卻用計算機運算的方式來介紹負數的表示原理,無疑是給剛接觸的小伙伴帶來了沉痛的負擔。

各位小伙伴可能已經發(fā)現(xiàn),在計算機中,處于最高位的0是一個非常神奇的存在。我們通過它能夠辨別是正數還是負數,也能夠通過它,來判斷一個數據是不是正確的(就是低位數據的每一位運算的結果,稱為校驗)。其實我們還可以利用0來確定真假值,比如0為真,非0為假,我們稱之為“布爾值”。

剛剛我們找到了負數的表示方案,此時,我們就需要找到非整數的表示方法了。那么如何利用整數來表示非整數呢?

一種方式是直接規(guī)定第多少位開始是小數部分,當然這種方式沒人會喜歡,而且靈活性也很差。

其實這里我們就考慮到了小數點的變動問題:小數點是不動(小數位數固定)還是變化的(小數位數不定)。顯然,兩種形式各有優(yōu)劣。

既然整數的表達最方便,那能否讓小數和整數直接掛鉤呢?可以。

我們以科學計數法再舉個例子

使用二進制表示259.56,如果將其轉換為科學計數法就是2.5956*10^2。

但很顯然我們還是沒辦法直接表示,既然縮小不行,那就嘗試放大。于是我們可到等價的值25956*10^-2。這時其中所有相關的數值我們都是在計算機方便的表示:25956、10和-2。

但是不要忘了,計算機是基于二進制的,并非十進制,那就意味著,必須將這仨兄弟都轉換成二進制就可以了。

可是,好像不太容易啊。因為我們一直是按照十進制來處理,但換成二進制中,小數點的變動就不一樣了。

所以我們將259.56拆成兩部分,使用常規(guī)方案表示整數部分259,使用小數表示法表示小數部分0.56。

在十進制的世界中,1是1*10^0,10是1*10^1,0.1是1*10^-1。

在二進制中也是基本一致的,1是1*2^0,2是1*2^1。

也就是說,我們需要表達某個大數,就是讓這個數除以基數,十進制的基數就是10,那么二進制的基數就是2;反之,如果我們需要表達一個湊不整基數的小數,就需要讓這個數乘以基數。

例如:256就是200+50+6=2*100 +5*10+6*1,表達邏輯是讓原來的數縮小,讓基數增大。

再如:0.25就是0.2+0.05=2*10^-1+5*10^-2,表達邏輯是原來的數變大,讓基數減小。(說法不是很嚴謹,因為不是讓基數本身發(fā)生變化,而是權值,或者說是指數部分)

那么,0.56表示成二進制就是讓這個數一直乘以2,直到小數部分沒有值為止。

0.56 * 2 = 1.12 -> 取 1

0.12 * 2 = 0.24 -> 取 0

0.24 * 2 = 0.48 -> 取 0

0.48 * 2 = 0.96 -> 取 0

0.96 * 2 = 1.92 -> 取 1

……

很長很長:.100 0111 1010 1110 0001 0100 0111 1010 1110 0001 0100 0111 1011

所以就涉及到精度問題。。。因為我們不可能把所有精力和空間全浪費在小數的處理上。除非。。。有東西能夠幫我們自動完成這件事。

那么,上面的259.56就可以分成三部分了,整數部分、小數部分、小數點位數。

當然,這只是一個示例。并不一定是現(xiàn)代計算機中用到的表達方式。

至此,我們已經利用計算機中原有的東西實現(xiàn)了一些類型,如:數值、字符、布爾值,暫且稱他們?yōu)椤俺跏紨祿愋汀卑伞?/p>


非常規(guī)入門C語言:2、初始數據類型的評論 (共 條)

分享到微博請遵守國家法律
会宁县| 乾安县| 汉寿县| 平南县| 宁国市| 富宁县| 苗栗县| 苏尼特右旗| 河源市| 咸丰县| 宁国市| 钟山县| 类乌齐县| 田东县| 巴里| 响水县| 金平| 梁平县| 房山区| 乌鲁木齐市| 东乡县| 岳池县| 宁夏| 广宗县| 邛崃市| 蓝田县| 南阳市| 应城市| 乐山市| 惠水县| 五华县| 芷江| 堆龙德庆县| 连州市| 普宁市| 崇礼县| 孟津县| 偏关县| 莱芜市| 洪洞县| 沧州市|