?? 教學--第四章 數據類型.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://d2school.com/bcyl/bhcpp/newls/ls04.htm -->
<HTML><HEAD><TITLE>教學--第四章 數據類型</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節標題 {
FONT-WEIGHT: bold; FONT-SIZE: 12pt
}
TD {
FONT-SIZE: 9pt
}
.tdtitle {
FONT-SIZE: 20pt
}
.celltopline {
BORDER-TOP: #000000 1px solid
}
.menucell {
FONT-SIZE: 10pt
}
#glowtext {
FONT-SIZE: 10pt; FILTER: glow(color=red,strength=1); WIDTH: 100%
}
A:link {
FONT: 10pt 宋體; COLOR: blue; TEXT-DECORATION: none
}
A:visited {
FONT: 10pt 宋體; COLOR: purple; TEXT-DECORATION: none
}
A:active {
FONT: 10pt 宋體; COLOR: red; TEXT-DECORATION: underline
}
A:hover {
COLOR: blue; TEXT-DECORATION: underline
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=3><!-- 標題 --><!--標題結束 --><A name=頁首></A>
<CENTER>
<TABLE height=154 cellSpacing=4 cellPadding=4 width=760 border=0>
<TBODY>
<TR>
<TD
style="FONT-SIZE: 10pt; MARGIN-LEFT: 12px; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; MARGIN-RIGHT: 12px; FONT-FAMILY: 宋體"
width="100%" height=148>
<H2><BR>第四章 數據類型</H2>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.1">4.1
這是個有類型的世界</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2">4.2
數據類型基本概念</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.1">4.2.1
理解數據類型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.2">4.2.2
理解整型和實型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.3">4.2.3
理解數值的范圍</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.4">4.2.4
理解有符號數和無符號數</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.3">4.3
字符集和保留字</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.3.1">4.3.1
字符集</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.3.2">4.3.2
保留字</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4">4.4
基本數據類型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4.1">4.4.1
字符型和各種整型、實型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4.2">4.4.2
布爾型(bool)和無類型(void)</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4.3">4.4.3
為數據類型起別名:typedef</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.5">4.5 sizeof
的使用</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.5.1">4.5.1 sizeof
例程</A><BR></P>
<H3><A name=4.1>4.1</A> 這是個有類型的世界</H3>
<P>問大家一個問題:</P>
<P>現實生活,有哪些信息可以用計算機可以管理呢?</P>
<P>職工、學員、客戶、工資、原材料、產品、商品……現實中實現用計算機管理的信息已是無數。</P>
<P>職工又有什么信息呢?</P>
<P>職工有姓名、性別、出生年月、家庭住址、電話,婚否、工齡、工種、工資、等等。</P>
<P> </P>
<P>這兩個問題你可能回答得不錯,現在,考驗你前幾章有沒有認真學習的時刻到了,請看下面這個問題:</P>
<P>所有的這些信息,在計算機里都是以什么樣的數據形式來表達呢?請自覺閉上眼睛,想一想。再看以下的各種回答。</P>
<P> </P>
<P>“二進數”,正確。</P>
<P>“已數字化的數據”,也算正確。</P>
<P>“0和1”,正確。</P>
<P>“機器語言”,正確,你還記得第一章的內容啊,不錯。</P>
<P> </P>
<P>本章需要繼續的一個問題就由此開始。所有的信息都用機器語言——那些0和1——表達,那你我編寫程序豈不很難?</P>
<P>這是第一章的問題,你還記得在第一章關于本問題回答嗎?那就是:機器語言不好記,那就用高級語言。高級語言高級在哪里呢?第一章也有答案:就高級在它盡量向“高級動物”的思維習慣做了一些接近。當然,只能說盡量,它必須仍然保持符合機器的絕大部分特點,否則,大家就不要學<B>計算機</B>語言了。</P>
<P>數據類型,就是計算機語言向人類語言靠近時,走出的第一步,很重要的一步。(機器語言或匯編語里,沒有數據類型一說。)</P>
<P>人類的世界,是有類型的世界。</P>
<P>樹木花草,歸一類:植物;</P>
<P>豬狗貓羊,動物;</P>
<P>金銀銅鐵,金屬;</P>
<P>你我他她,人類。(不要告訴我你不是人類,在這虛擬的網絡的世界……)</P>
<P>上一章筆者“鼓吹”過一個觀點:<B>整個世界都可以用數據和處理來表達。</B>基于此,整個世界就是一個程序;而萬物是世界的數據。如果你找一個人,對他說:“你等于一只豬”,他一定暴跳如雷。為什么呢?嘻嘻,學了這一章,我們就可以從程序的角度來解釋了:人和豬不是一類型,不適于做賦值操作。待以后我們學了C++的“類”,則又有更好回答:上帝創造世界是,沒有為人“類”實現參數為豬“類”的拷貝構造函數,或等號重載函數。</P>
<P>(想和上帝做同行?快做個程序員。)</P>
<H3><A name=4.2>4.2</A> 數據類型基本概念</H3>
<H4><A name=4.2.1>4.2.1</A> 理解數據類型</H4>
<P>“數據類型”就是這么一個很好理解的概念。我們的重點是了解在計算機編程世界中,有哪些基本的數據類型?在人類世界里,數據類型那就多了,把人類的對萬物劃分類型的方法照搬入計算機世界,顯然不可能。怎么辦呢?方法就是:抽象。</P>
<P>計算機先哲們為我們做了這一切。其中,最重要類型,也稱為C/C++語言的<B>基本數據類型</B>,只有兩個:“數值”和“字符”。</P>
<P>第一是“數值類型”。這樣,在職工的信息中,譬如年紀,工齡、工資就有了歸屬。你現在需要暫時不將目光從屏幕前移開,想一想“數值類型”是一個多好的抽象結果!無論進行任何信息管理,離開了“數”,還能管理什么?</P>
<P> </P>
<P>第二是“字符類型”。像職工姓名或家庭住址,這些由字符類型的數據組成。你可能想不到的還有,職工的電話號碼
010-1234567,這也是由字符類型數據組成。0、1、2、3不是數字嗎?應該屬于上面的“數值”類型吧?嗯,你聽我說:現實生活中,數字被廣泛地應用在兩種不同范疇:其一是那些典型的,需要進行計算的場合。比如雞蛋1斤2.3元;其二則那些只用來表示符號的范疇。比如電話號碼,比如車牌號。把兩個電話號碼進行相加或相減的操作是沒有意義的。基于數字的兩種完全不一樣的使用范疇,所以在被抽象到計算機程序語言時,數字被分到“數值”和“字符”兩種類型中。但字符類型并不只有阿拉伯數字,鍵盤上的<B>字</B>母<B>符</B>號,都屬于<B>字符</B>類型。</P>
<P> </P>
<P>在C/C++中,“字符類型”其實也可歸入數值類型。在某些情況下,它仍然會被用來參與計算。比如在計算機中,字符‘A’加1后,會得到下一個字符‘B’,這種操作符合我們的習慣。</P>
<H4><A name=4.2.2>4.2.2</A> 理解整型和實型</H4>
<P>數值類型又被分為“整型”和“實型”。整型就是不帶小數位的數,而實型則是指帶小數位的數,也稱為“浮點數”。我們在生活中一般并不做如此區分。譬如說雞蛋的價格罷,今兒便宜了,一斤2塊整,但這不防礙明兒價漲了,我們說成:漲了,2.30元一斤。在編程時可不能這樣,你必須事先考慮到雞蛋的價格是必須帶小數的,就算現在是2塊整,也得將價格定為實型,否則,漲成2塊3時,計算機會把那0.3元給丟了,還是變成2元整。</P>
<P>你會問為什么不直接就定一個實型就好呢?實型不就包含了整型的值嗎(如2.0等于2元)?好!問得好,我不喜歡書上說什么就記什么,一個“為什么”也不去想的學習方法。由于能力的限制,大多數人如你我,都不能為這個世界發明奉獻什么新技術,我們只能作為技術的“接受者”而活在這個世上。然而正因為只能作為接受者,我們就更應該在學習任何技術前,先學會從一定的高度來詢問:為什么會有這個技術(這個技術為什么會出現)?我現在需要這個技術嗎(必竟學習需要占用時間)?這么做并非是一種消極態度,相反,它的積極意議在于:經過這種思考,你不僅可以把有限的時間花在值的學習上,而且只有弄明白了一樣技術(或技術的概念)產生的需要,我們才有可能真正理解它,從而比別人學得更深刻更本質。</P>
<P>一個問題牽出一堆廢話,回答卻很簡單:因為在計算機里,對整數的運算要遠遠快于對浮點數的運算,所以,在人類的思維習慣與計算機特點之間,必須做一個折衷。</P>
<P>折衷的結果就是雖然都是數值類型,但程序員在程序時,必須事先想好,哪些數據是必須帶小數計算的,那些數據定為實型,比如工資,沒有哪個員工會認為老板可以將自已工資中的小數位忽略不計;而那些可以不用,或者可以不計較小數的數值,則被建議設計成整型,比如人的年紀,雖然可以,但我們很少需要有類似1.6歲這種說法。想想,假如一位女士說自已28歲,而你卻立刻糾正她:“不,準確地說,您已經28.7歲了”……結局會怎樣呢?為了那0.7歲,不僅你的程序會跑得慢,而且會倍受女人的白眼殺傷。</P>
<P>想想其實也很自然:工資必須設計成實型,而年齡雖然不是必須,但建議設計成整型。</P>
<H4><A name=4.2.3>4.2.3</A> 理解數值的范圍</H4>
<P>然而事情并未就此結束。</P>
<P>顧及計算機的運行速度,人(程序員)做出了妥協,必須面對“整型”或“實型”的考慮。另一方面,和速度同樣重要的是計算機的空間的考慮。它讓程序員必須再做一步妥協。</P>
<P>小時候你一定有過這樣的經歷:你說100,另一個小伙伴就說101。你說1000,他就說1001,你說10000,他就說:那我10001。總之他就是要比你大1。這種游戲不會有分出勝負的結局,只會讓你郁悶為什么就不能有個最大數讓你說了以后,那家伙就再了無法往上加1了!現在你學編程,兒時的“妄想”終于在計算機的世界中實現了。在計算機世界中,你可以說一個數,當別人再住這個數加1時,真不幸,計算機會告訴他說:加1是加1了,可是結果變成0,甚至是負數。</P>
<P>這就是計算機的空間問題:任何一個量,都有一個大的上限,和小的下限,出了這個范圍(比上限還大,比下限還小),就會稱為<B>溢出</B>。這是一種物理的現實,也是一種人為的規定。為什么要這樣規定?原因是計算機的存儲器,特別是其中很重要的內存(見上章),其可存儲的數據多少總是有限度。(而且,同樣大小數,2進制的表達形式比10進制長得多),如果允許編程像生活中一樣任何一個數都可以很大很大,也就是這個量表達起來將很長很長,那么存儲器的空間就會很快用完!(無窮大就不用說了,因為不可能有無窮大的存儲器)。</P>
<P>就是這樣,數值類型在被劃分為整型和實型后,將根據所<B>占用的空間</B>而被繼續劃分為幾種不同類型。而我們,在考慮工資必須設計成帶小數的實型后,必須再面對一個設計上的考慮,工資這個量在程序里要占多大空間?依據其實很簡單,就看你的單位最高月薪是多少,憑此找到一個合適的類型。比如月薪不超過1萬元,那我們選擇一個剛剛可以包含10000的數據類型。</P>
<P>兩種基礎類型:數值類型和字符類型,前者說了很多,現在我們也來對字符類型做一些附加說明。字符類型要比數值類型簡單得多:它不能帶小數,所以沒有整型實型之說。它占用1個字節,已經是計算機能單獨處理的最小空間單位,所以也不存在繼續分為不同空間長度的問題。因此,我們將以它為例,詳細說明有關數據類型的一些基本而重要的概念。</P>
<P>第1、由于計算機和編程都是老外的發明,而老外生活中常用的的字符并不多——主要是阿拉伯數字、英文字母、標點符號等——所以字符的寬度被定為1個<B>字節</B>(如果忘了什么叫字節,請看上章)。</P>
<P>1字節 =
8位,所以它能表示的最大數當然是8位都是1(既然2進制的數只能是0或1,如果是我們常見的10進制,那就8位都為9,這樣說,你該懂了?)。</P>1字節的二進制數中,最大的數:11111111。
<P>這個數的大小是多少呢?讓我們來把它轉換為十進制數。</P>
<P>無論是什么進制,都是左邊是高位,右邊是低位。第一章中我們說過,10進制數的最低位(個)位的權值是10<SUP>0</SUP>,第二位是10<SUP>1</SUP>,第三位是10<SUP>2</SUP>……,用小學課本上的說法就是:個位上的數表示幾個1,十位上的數表示向個10,百位上的數表示幾個100……</P>
<P>二進制數則是:第1位數表示幾個1
(2<SUP>0</SUP>),第2位數表示幾個2(2<SUP>1</SUP>),第3位數表示幾個4(2<SUP>2</SUP>),第4位數表示向個8(2<SUP>3</SUP>)……</P>
<P><B>在C/C++中,很多計數的習慣都是從0開始</B>,所以,在你看明白上面那行內容后,讓我們立刻改口換成下面的說法,以后我們只用這種說法:</P>
<P>二進制數:第<B>0</B>位數表示幾個1
(2<SUP>0</SUP>),第<B>1</B>位數表示幾個2(2<SUP>1</SUP>),第<B>3</B>位數表示幾個4(2<SUP>2</SUP>),第<B>4</B>位數表示向個8(2<SUP>3</SUP>)……</P>
<P>按照這種說法,我們可以發現,從右向左數,第n位數的權值 = 2的n次方。</P>
<P><B>二進制各位權值的計算方法: 第n位權值 = 2<SUP>n</SUP></B></P>
<P> </P>
<P>下表詳細地表示 2進制數:11111111 是如何逐位計算,累加得到10進制的值:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<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%">7</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">6</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">5</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">4</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">3</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -