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