?? 教學(xué)--第四章 數(shù)據(jù)類型.htm
字號:
align=middle width="10%">2</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">0</TD>
<TD
style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="13%" rowSpan=3>合計(jì)</TD></TR>
<TR>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
width="15%">權(quán)值</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">2<SUP>7</SUP>=128</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">2<SUP>6</SUP>=64</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">2<SUP>5</SUP>=32</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">2<SUP>4</SUP>=16</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">2<SUP>3</SUP>=8</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">2<SUP>2</SUP>=4</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">2<SUP>1</SUP>=2</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">2<SUP>0</SUP>=1</TD></TR>
<TR>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
width="15%">2進(jìn)制</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">1</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="10%">1</TD></TR>
<TR>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
width="15%">10進(jìn)制</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="9%">128</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="9%">64</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="9%">32</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="9%">16</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="9%">8</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="10%">4</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="10%">2</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle width="10%">1</TD>
<TD
style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid"
align=middle
width="13%"> 255</TD></TR></TBODY></TABLE>上表表示了這么一個(gè)計(jì)算過程(*表示乘號):
<P>1 * 2<SUP>7</SUP> + 1 * 2<SUP>6</SUP> + 1 * 2<SUP>5</SUP> + 1 *
2<SUP>4</SUP> + 1 * 2<SUP>3</SUP> + 1 * 2<SUP>2</SUP> + 1 * 2<SUP>1</SUP>
+ 1* 2<SUP>0</SUP> = 255</P>
<P>(順便說一句,如果你忘了2<SUP>0 </SUP>等于多少有點(diǎn)遲疑,請復(fù)習(xí)一下初中的數(shù)學(xué)知識:任何數(shù)的0次方都等于1)</P>
<P>結(jié)果是:</P>
<P>11111111(b) = 255 (d)</P>
<P>(為不了互相混淆,我們在書中常用(b)來表示前面的數(shù)是2進(jìn)制的,而(d)則表示該數(shù)是10進(jìn)制數(shù)。同樣地,另有8進(jìn)制數(shù)用(o)表示,16進(jìn)制用(h)表示。不過記住了,這只是在書中使用,在程序中,另有一套表示方法。)</P>
<P> </P>
<P>以前我們知道1個(gè)字節(jié)有8位,現(xiàn)在通過計(jì)算,我們又得知:1個(gè)字節(jié)可以表達(dá)的最大的數(shù)是255,也就是說表示0~255這256個(gè)數(shù)。</P>
<P>那么兩個(gè)字節(jié)(雙字節(jié)數(shù))呢?雙字節(jié)共16位。
1111111111111111,這個(gè)數(shù)并不大,但長得有點(diǎn)眼暈,從現(xiàn)在起,我們要學(xué)會(huì)這樣來表達(dá)二制數(shù):</P>
<P>1111 1111 1111 1111,即每4位隔一空格。</P>
<P>雙字節(jié)數(shù)最大值為:</P>
<P>1 * 2<SUP>15</SUP> + 1 *2<SUP>14</SUP> + 1* 2<SUP>13</SUP> + 1 *
2<SUP>12</SUP> + 1 * 2<SUP>11</SUP> + 1 * 2<SUP>10</SUP> + …… + 1 *
2<SUP>2</SUP> + 1 * 2<SUP>1</SUP> + 1* 2<SUP>0</SUP> = 65535</P>
<P> </P>
<P>很自然,我們可以想到,一種數(shù)據(jù)類型允許的最大值,和它的位數(shù)有關(guān)。具體的計(jì)算方法方法是,如果它有n位,那么最大值就是:</P>
<P><B>n位二進(jìn)制數(shù)的最大值:1 * 2</B><SUP>(n-1)</SUP><B> + 1 *
2</B><SUP>(n-2)</SUP><B> + ... + 1 * 2</B><SUP>0</SUP></P>
<P> </P>
<P>任何一種基本數(shù)據(jù)類型,都有其范圍。比如字符類型,它的最大值是255,那么,當(dāng)一個(gè)數(shù)在其類型的范圍已經(jīng)是最大值時(shí),如果再往上加1,就會(huì)照成“溢出”。</P>
<P>其實(shí),有限定的范圍的數(shù)量,并不只在計(jì)算機(jī)中出現(xiàn)。鐘表就是一個(gè)例子。10點(diǎn)再加1點(diǎn)是11點(diǎn),再加1點(diǎn)是12點(diǎn),可是再加1點(diǎn),就又回到1點(diǎn)。再如汽車的行程表,假設(shè)最多只能顯示99999公里,當(dāng)達(dá)到最高值后繼續(xù)行駛,行程表就會(huì)顯示為00000公里。</P>
<H4><A name=4.2.4>4.2.4</A> 理解有符號數(shù)和無符號數(shù)</H4>
<P>回頭看上一節(jié),我們所講的數(shù)都是正數(shù)。同樣是年紀(jì)和工資,前者不需要有負(fù)值,但后者可能需要——至少所有的老板都這樣認(rèn)為。</P>
<P>那么,負(fù)數(shù)在計(jì)算機(jī)中如何表示呢?</P>
<P>這一點(diǎn),你可能聽過兩種不同的回答。</P>
<P>一種是教科書,它會(huì)告訴你:計(jì)算機(jī)用“補(bǔ)碼”表示負(fù)數(shù)??墒怯嘘P(guān)“補(bǔ)碼”的概念一說就得一節(jié)課,這一些我們需要在第6章中用一章的篇幅講2進(jìn)制的一切。再者,用“補(bǔ)碼”表示負(fù)數(shù),其實(shí)一種公式,公式的作用在于告訴你,想得問題的答案,應(yīng)該如何計(jì)算。卻并沒有告訴你為什么用這個(gè)公式就可以和答案? </P>
<P>另一種是一些程序員告訴你的:用二進(jìn)制數(shù)的最高位表示符號,最高位是0,表示正數(shù),最高位是1,表示負(fù)數(shù)。這種說法本身沒錯(cuò),可是如果沒有下文,那么它就是錯(cuò)的。至少它不能解釋,為什么字符類型的-1用二進(jìn)制表示是“1111
1111”(16進(jìn)制為FF);而不是我們更能理解的“1000 0001”。(為什么說后者更好理解呢?因?yàn)榧热徽f最高位是1時(shí)表示負(fù)數(shù),那1000
0001不是正好是-1嗎?)。</P>
<P>讓我們從頭說起。</P>
<P>1、你自已決定是否需要有正負(fù)。</P>
<P>就像我們必須決定某個(gè)量使用整數(shù)還是實(shí)數(shù),使用多大的范圍數(shù)一樣,我們必須自已決定某個(gè)量是否需要正負(fù)。如果這個(gè)量不會(huì)有負(fù)值,那么我們可以定它為帶正負(fù)的類型。</P>
<P><B>在計(jì)算機(jī)中,可以區(qū)分正負(fù)的類型,稱為有符類型,無正負(fù)的類型(只有正值),稱為無符類型。</B></P>
<P><B>數(shù)值類型分為整型或?qū)嵭停渲姓陀址譃闊o符類型或有符類型,而實(shí)型則只有符類型。</B></P>
<P><B>字符類型也分為有符和無符類型。</B></P>
<P>比如有兩個(gè)量,年齡和庫存,我們可以定前者為無符的字符類型,后者定為有符的整數(shù)類型。</P>
<P>2、使用二制數(shù)中的最高位表示正負(fù)。</P>
<P>首先得知道最高位是哪一位?1個(gè)字節(jié)的類型,如字符類型,最高位是第7位,2個(gè)字節(jié)的數(shù),最高位是第15位,4個(gè)字節(jié)的數(shù),最高位是第31位。不同長度的數(shù)值類型,其最高位也就不同,但總是最左邊的那位(如下示意)。字符類型固定是1個(gè)字節(jié),所以最高位總是第7位。</P>
<P>(紅色為最高位)</P>
<P>單字節(jié)數(shù): <B><FONT color=#ff0000>1</FONT></B>111 1111</P>
<P>雙字節(jié)數(shù): <B><FONT color=#ff0000>1</FONT></B>111 1111 1111 1111</P>
<P>四字節(jié)數(shù): <B><FONT color=#ff0000>1</FONT></B>111 1111 1111 1111 1111 1111
1111 1111</P>
<P> </P>
<P>當(dāng)我們指定一個(gè)數(shù)量是無符號類型時(shí),那么其最高位的1或0,和其它位一樣,用來表示該數(shù)的大小。</P>
<P>當(dāng)我們指定一個(gè)數(shù)量是無符號類型時(shí),此時(shí),最高數(shù)稱為“符號位”。為1時(shí),表示該數(shù)為負(fù)值,為0時(shí)表示為正值。</P>
<P> </P>
<P>3、無符號數(shù)和有符號數(shù)的范圍區(qū)別。</P>
<P>無符號數(shù)中,所有的位都用于直接表示該值的大小。有符號數(shù)中最高位用于表示正負(fù),所以,當(dāng)為正值時(shí),該數(shù)的最大值就會(huì)變小。我們舉一個(gè)字節(jié)的數(shù)值對比:</P>
<P>無符號數(shù): 1111 1111 值:255 1* 2<SUP>7</SUP> + 1* 2<SUP>6</SUP> +
1* 2<SUP>5</SUP> + 1* 2<SUP>4</SUP> + 1* 2<SUP>3</SUP> + 1* 2<SUP>2</SUP>
+ 1* 2<SUP>1</SUP> + 1* 2<SUP>0</SUP></P>
<P>有符號數(shù): 0111 1111
值:127 1* 2<SUP>6</SUP> +
1* 2<SUP>5</SUP> + 1* 2<SUP>4</SUP> + 1* 2<SUP>3</SUP> + 1* 2<SUP>2</SUP>
+ 1* 2<SUP>1</SUP> + 1* 2<SUP>0</SUP></P>
<P> </P>
<P>同樣是一個(gè)字節(jié),無符號數(shù)的最大值是255,而有符號數(shù)的最大值是127。原因是有符號數(shù)中的最高位被挪去表示符號了。并且,我們知道,最高位的權(quán)值也是最高的(對于1字節(jié)數(shù)來說是2的7次方=128),所以僅僅少于一位,最大值一下子減半。</P>
<P>不過,有符號數(shù)的長處是它可以表示負(fù)數(shù)。因此,雖然它的在最大值縮水了,卻在負(fù)值的方向出現(xiàn)了伸展。我們?nèi)砸粋€(gè)字節(jié)的數(shù)值對比:</P>
<P>無符號數(shù):
0 ----------------- 255</P>
<P>有符號數(shù): -128 --------- 0
---------- 127</P>
<P> </P>
<P>同樣是一個(gè)字節(jié),無符號的最小值是 0
,而有符號數(shù)的最小值是-128。所以二者能表達(dá)的不同的數(shù)值的個(gè)數(shù)都一樣是256個(gè)。只不過前者表達(dá)的是0到255這256個(gè)數(shù),后者表達(dá)的是-128到+127這256個(gè)數(shù)。</P>
<P>一個(gè)有符號的數(shù)據(jù)類型的最小值是如何計(jì)算出來的呢?</P>
<P>有符號的數(shù)據(jù)類型的最大值的計(jì)算方法完全和無符號一樣,只不過它少了一個(gè)最高位(見第3點(diǎn))。但在負(fù)值范圍內(nèi),數(shù)值的計(jì)算方法<B>不能直接使用</B>1*
2<SUP>6</SUP> + 1* 2<SUP>5</SUP>
的公式進(jìn)行轉(zhuǎn)換。在計(jì)算機(jī)中,負(fù)數(shù)除為最高位為1以外,還采用<B>補(bǔ)碼</B>形式進(jìn)行表達(dá)。所以在計(jì)算其值前,需要對補(bǔ)碼進(jìn)行還原。這些內(nèi)容我們將在第六章中的二進(jìn)制知識中統(tǒng)一學(xué)習(xí)。</P>
<P>這里,先直觀地看一眼補(bǔ)碼的形式:</P>
<P>以我們原有的數(shù)學(xué)經(jīng)驗(yàn),在10進(jìn)制中:1 表示正1,而加上負(fù)號:-1 表示和1相對的負(fù)值。</P>
<P>那么,我們會(huì)很容易認(rèn)為在2進(jìn)制中(1個(gè)字節(jié)): 0000 0001 表示正1,則高位為1后:1000 0001應(yīng)該表示-1。</P>
<P>然而,事實(shí)上計(jì)算機(jī)中的規(guī)定有些相反,請看下表:</P>
<P> </P>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -