?? 教學(xué)--第四章 數(shù)據(jù)類型.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>教學(xué)--第四章 數(shù)據(jù)類型</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節(jié)標(biāo)題 {
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><!-- 標(biāo)題 --><!--標(biāo)題結(jié)束 --><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>第四章 數(shù)據(jù)類型</H2>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.1">4.1
這是個(gè)有類型的世界</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2">4.2
數(shù)據(jù)類型基本概念</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.1">4.2.1
理解數(shù)據(jù)類型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.2">4.2.2
理解整型和實(shí)型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.3">4.2.3
理解數(shù)值的范圍</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.4">4.2.4
理解有符號數(shù)和無符號數(shù)</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
基本數(shù)據(jù)類型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4.1">4.4.1
字符型和各種整型、實(shí)型</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
為數(shù)據(jù)類型起別名: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> 這是個(gè)有類型的世界</H3>
<P>問大家一個(gè)問題:</P>
<P>現(xiàn)實(shí)生活,有哪些信息可以用計(jì)算機(jī)可以管理呢?</P>
<P>職工、學(xué)員、客戶、工資、原材料、產(chǎn)品、商品……現(xiàn)實(shí)中實(shí)現(xiàn)用計(jì)算機(jī)管理的信息已是無數(shù)。</P>
<P>職工又有什么信息呢?</P>
<P>職工有姓名、性別、出生年月、家庭住址、電話,婚否、工齡、工種、工資、等等。</P>
<P> </P>
<P>這兩個(gè)問題你可能回答得不錯(cuò),現(xiàn)在,考驗(yàn)?zāi)闱皫渍掠袥]有認(rèn)真學(xué)習(xí)的時(shí)刻到了,請看下面這個(gè)問題:</P>
<P>所有的這些信息,在計(jì)算機(jī)里都是以什么樣的數(shù)據(jù)形式來表達(dá)呢?請自覺閉上眼睛,想一想。再看以下的各種回答。</P>
<P> </P>
<P>“二進(jìn)數(shù)”,正確。</P>
<P>“已數(shù)字化的數(shù)據(jù)”,也算正確。</P>
<P>“0和1”,正確。</P>
<P>“機(jī)器語言”,正確,你還記得第一章的內(nèi)容啊,不錯(cuò)。</P>
<P> </P>
<P>本章需要繼續(xù)的一個(gè)問題就由此開始。所有的信息都用機(jī)器語言——那些0和1——表達(dá),那你我編寫程序豈不很難?</P>
<P>這是第一章的問題,你還記得在第一章關(guān)于本問題回答嗎?那就是:機(jī)器語言不好記,那就用高級語言。高級語言高級在哪里呢?第一章也有答案:就高級在它盡量向“高級動物”的思維習(xí)慣做了一些接近。當(dāng)然,只能說盡量,它必須仍然保持符合機(jī)器的絕大部分特點(diǎn),否則,大家就不要學(xué)<B>計(jì)算機(jī)</B>語言了。</P>
<P>數(shù)據(jù)類型,就是計(jì)算機(jī)語言向人類語言靠近時(shí),走出的第一步,很重要的一步。(機(jī)器語言或匯編語里,沒有數(shù)據(jù)類型一說。)</P>
<P>人類的世界,是有類型的世界。</P>
<P>樹木花草,歸一類:植物;</P>
<P>豬狗貓羊,動物;</P>
<P>金銀銅鐵,金屬;</P>
<P>你我他她,人類。(不要告訴我你不是人類,在這虛擬的網(wǎng)絡(luò)的世界……)</P>
<P>上一章筆者“鼓吹”過一個(gè)觀點(diǎn):<B>整個(gè)世界都可以用數(shù)據(jù)和處理來表達(dá)。</B>基于此,整個(gè)世界就是一個(gè)程序;而萬物是世界的數(shù)據(jù)。如果你找一個(gè)人,對他說:“你等于一只豬”,他一定暴跳如雷。為什么呢?嘻嘻,學(xué)了這一章,我們就可以從程序的角度來解釋了:人和豬不是一類型,不適于做賦值操作。待以后我們學(xué)了C++的“類”,則又有更好回答:上帝創(chuàng)造世界是,沒有為人“類”實(shí)現(xiàn)參數(shù)為豬“類”的拷貝構(gòu)造函數(shù),或等號重載函數(shù)。</P>
<P>(想和上帝做同行?快做個(gè)程序員。)</P>
<H3><A name=4.2>4.2</A> 數(shù)據(jù)類型基本概念</H3>
<H4><A name=4.2.1>4.2.1</A> 理解數(shù)據(jù)類型</H4>
<P>“數(shù)據(jù)類型”就是這么一個(gè)很好理解的概念。我們的重點(diǎn)是了解在計(jì)算機(jī)編程世界中,有哪些基本的數(shù)據(jù)類型?在人類世界里,數(shù)據(jù)類型那就多了,把人類的對萬物劃分類型的方法照搬入計(jì)算機(jī)世界,顯然不可能。怎么辦呢?方法就是:抽象。</P>
<P>計(jì)算機(jī)先哲們?yōu)槲覀冏隽诉@一切。其中,最重要類型,也稱為C/C++語言的<B>基本數(shù)據(jù)類型</B>,只有兩個(gè):“數(shù)值”和“字符”。</P>
<P>第一是“數(shù)值類型”。這樣,在職工的信息中,譬如年紀(jì),工齡、工資就有了歸屬。你現(xiàn)在需要暫時(shí)不將目光從屏幕前移開,想一想“數(shù)值類型”是一個(gè)多好的抽象結(jié)果!無論進(jìn)行任何信息管理,離開了“數(shù)”,還能管理什么?</P>
<P> </P>
<P>第二是“字符類型”。像職工姓名或家庭住址,這些由字符類型的數(shù)據(jù)組成。你可能想不到的還有,職工的電話號碼
010-1234567,這也是由字符類型數(shù)據(jù)組成。0、1、2、3不是數(shù)字嗎?應(yīng)該屬于上面的“數(shù)值”類型吧?嗯,你聽我說:現(xiàn)實(shí)生活中,數(shù)字被廣泛地應(yīng)用在兩種不同范疇:其一是那些典型的,需要進(jìn)行計(jì)算的場合。比如雞蛋1斤2.3元;其二則那些只用來表示符號的范疇。比如電話號碼,比如車牌號。把兩個(gè)電話號碼進(jìn)行相加或相減的操作是沒有意義的。基于數(shù)字的兩種完全不一樣的使用范疇,所以在被抽象到計(jì)算機(jī)程序語言時(shí),數(shù)字被分到“數(shù)值”和“字符”兩種類型中。但字符類型并不只有阿拉伯?dāng)?shù)字,鍵盤上的<B>字</B>母<B>符</B>號,都屬于<B>字符</B>類型。</P>
<P> </P>
<P>在C/C++中,“字符類型”其實(shí)也可歸入數(shù)值類型。在某些情況下,它仍然會被用來參與計(jì)算。比如在計(jì)算機(jī)中,字符‘A’加1后,會得到下一個(gè)字符‘B’,這種操作符合我們的習(xí)慣。</P>
<H4><A name=4.2.2>4.2.2</A> 理解整型和實(shí)型</H4>
<P>數(shù)值類型又被分為“整型”和“實(shí)型”。整型就是不帶小數(shù)位的數(shù),而實(shí)型則是指帶小數(shù)位的數(shù),也稱為“浮點(diǎn)數(shù)”。我們在生活中一般并不做如此區(qū)分。譬如說雞蛋的價(jià)格罷,今兒便宜了,一斤2塊整,但這不防礙明兒價(jià)漲了,我們說成:漲了,2.30元一斤。在編程時(shí)可不能這樣,你必須事先考慮到雞蛋的價(jià)格是必須帶小數(shù)的,就算現(xiàn)在是2塊整,也得將價(jià)格定為實(shí)型,否則,漲成2塊3時(shí),計(jì)算機(jī)會把那0.3元給丟了,還是變成2元整。</P>
<P>你會問為什么不直接就定一個(gè)實(shí)型就好呢?實(shí)型不就包含了整型的值嗎(如2.0等于2元)?好!問得好,我不喜歡書上說什么就記什么,一個(gè)“為什么”也不去想的學(xué)習(xí)方法。由于能力的限制,大多數(shù)人如你我,都不能為這個(gè)世界發(fā)明奉獻(xiàn)什么新技術(shù),我們只能作為技術(shù)的“接受者”而活在這個(gè)世上。然而正因?yàn)橹荒茏鳛榻邮苷撸覀兙透鼞?yīng)該在學(xué)習(xí)任何技術(shù)前,先學(xué)會從一定的高度來詢問:為什么會有這個(gè)技術(shù)(這個(gè)技術(shù)為什么會出現(xiàn))?我現(xiàn)在需要這個(gè)技術(shù)嗎(必竟學(xué)習(xí)需要占用時(shí)間)?這么做并非是一種消極態(tài)度,相反,它的積極意議在于:經(jīng)過這種思考,你不僅可以把有限的時(shí)間花在值的學(xué)習(xí)上,而且只有弄明白了一樣技術(shù)(或技術(shù)的概念)產(chǎn)生的需要,我們才有可能真正理解它,從而比別人學(xué)得更深刻更本質(zhì)。</P>
<P>一個(gè)問題牽出一堆廢話,回答卻很簡單:因?yàn)樵谟?jì)算機(jī)里,對整數(shù)的運(yùn)算要遠(yuǎn)遠(yuǎn)快于對浮點(diǎn)數(shù)的運(yùn)算,所以,在人類的思維習(xí)慣與計(jì)算機(jī)特點(diǎn)之間,必須做一個(gè)折衷。</P>
<P>折衷的結(jié)果就是雖然都是數(shù)值類型,但程序員在程序時(shí),必須事先想好,哪些數(shù)據(jù)是必須帶小數(shù)計(jì)算的,那些數(shù)據(jù)定為實(shí)型,比如工資,沒有哪個(gè)員工會認(rèn)為老板可以將自已工資中的小數(shù)位忽略不計(jì);而那些可以不用,或者可以不計(jì)較小數(shù)的數(shù)值,則被建議設(shè)計(jì)成整型,比如人的年紀(jì),雖然可以,但我們很少需要有類似1.6歲這種說法。想想,假如一位女士說自已28歲,而你卻立刻糾正她:“不,準(zhǔn)確地說,您已經(jīng)28.7歲了”……結(jié)局會怎樣呢?為了那0.7歲,不僅你的程序會跑得慢,而且會倍受女人的白眼殺傷。</P>
<P>想想其實(shí)也很自然:工資必須設(shè)計(jì)成實(shí)型,而年齡雖然不是必須,但建議設(shè)計(jì)成整型。</P>
<H4><A name=4.2.3>4.2.3</A> 理解數(shù)值的范圍</H4>
<P>然而事情并未就此結(jié)束。</P>
<P>顧及計(jì)算機(jī)的運(yùn)行速度,人(程序員)做出了妥協(xié),必須面對“整型”或“實(shí)型”的考慮。另一方面,和速度同樣重要的是計(jì)算機(jī)的空間的考慮。它讓程序員必須再做一步妥協(xié)。</P>
<P>小時(shí)候你一定有過這樣的經(jīng)歷:你說100,另一個(gè)小伙伴就說101。你說1000,他就說1001,你說10000,他就說:那我10001。總之他就是要比你大1。這種游戲不會有分出勝負(fù)的結(jié)局,只會讓你郁悶為什么就不能有個(gè)最大數(shù)讓你說了以后,那家伙就再了無法往上加1了!現(xiàn)在你學(xué)編程,兒時(shí)的“妄想”終于在計(jì)算機(jī)的世界中實(shí)現(xiàn)了。在計(jì)算機(jī)世界中,你可以說一個(gè)數(shù),當(dāng)別人再住這個(gè)數(shù)加1時(shí),真不幸,計(jì)算機(jī)會告訴他說:加1是加1了,可是結(jié)果變成0,甚至是負(fù)數(shù)。</P>
<P>這就是計(jì)算機(jī)的空間問題:任何一個(gè)量,都有一個(gè)大的上限,和小的下限,出了這個(gè)范圍(比上限還大,比下限還小),就會稱為<B>溢出</B>。這是一種物理的現(xiàn)實(shí),也是一種人為的規(guī)定。為什么要這樣規(guī)定?原因是計(jì)算機(jī)的存儲器,特別是其中很重要的內(nèi)存(見上章),其可存儲的數(shù)據(jù)多少總是有限度。(而且,同樣大小數(shù),2進(jìn)制的表達(dá)形式比10進(jìn)制長得多),如果允許編程像生活中一樣任何一個(gè)數(shù)都可以很大很大,也就是這個(gè)量表達(dá)起來將很長很長,那么存儲器的空間就會很快用完!(無窮大就不用說了,因?yàn)椴豢赡苡袩o窮大的存儲器)。</P>
<P>就是這樣,數(shù)值類型在被劃分為整型和實(shí)型后,將根據(jù)所<B>占用的空間</B>而被繼續(xù)劃分為幾種不同類型。而我們,在考慮工資必須設(shè)計(jì)成帶小數(shù)的實(shí)型后,必須再面對一個(gè)設(shè)計(jì)上的考慮,工資這個(gè)量在程序里要占多大空間?依據(jù)其實(shí)很簡單,就看你的單位最高月薪是多少,憑此找到一個(gè)合適的類型。比如月薪不超過1萬元,那我們選擇一個(gè)剛剛可以包含10000的數(shù)據(jù)類型。</P>
<P>兩種基礎(chǔ)類型:數(shù)值類型和字符類型,前者說了很多,現(xiàn)在我們也來對字符類型做一些附加說明。字符類型要比數(shù)值類型簡單得多:它不能帶小數(shù),所以沒有整型實(shí)型之說。它占用1個(gè)字節(jié),已經(jīng)是計(jì)算機(jī)能單獨(dú)處理的最小空間單位,所以也不存在繼續(xù)分為不同空間長度的問題。因此,我們將以它為例,詳細(xì)說明有關(guān)數(shù)據(jù)類型的一些基本而重要的概念。</P>
<P>第1、由于計(jì)算機(jī)和編程都是老外的發(fā)明,而老外生活中常用的的字符并不多——主要是阿拉伯?dāng)?shù)字、英文字母、標(biāo)點(diǎn)符號等——所以字符的寬度被定為1個(gè)<B>字節(jié)</B>(如果忘了什么叫字節(jié),請看上章)。</P>
<P>1字節(jié) =
8位,所以它能表示的最大數(shù)當(dāng)然是8位都是1(既然2進(jìn)制的數(shù)只能是0或1,如果是我們常見的10進(jìn)制,那就8位都為9,這樣說,你該懂了?)。</P>1字節(jié)的二進(jìn)制數(shù)中,最大的數(shù):11111111。
<P>這個(gè)數(shù)的大小是多少呢?讓我們來把它轉(zhuǎn)換為十進(jìn)制數(shù)。</P>
<P>無論是什么進(jìn)制,都是左邊是高位,右邊是低位。第一章中我們說過,10進(jìn)制數(shù)的最低位(個(gè))位的權(quán)值是10<SUP>0</SUP>,第二位是10<SUP>1</SUP>,第三位是10<SUP>2</SUP>……,用小學(xué)課本上的說法就是:個(gè)位上的數(shù)表示幾個(gè)1,十位上的數(shù)表示向個(gè)10,百位上的數(shù)表示幾個(gè)100……</P>
<P>二進(jìn)制數(shù)則是:第1位數(shù)表示幾個(gè)1
(2<SUP>0</SUP>),第2位數(shù)表示幾個(gè)2(2<SUP>1</SUP>),第3位數(shù)表示幾個(gè)4(2<SUP>2</SUP>),第4位數(shù)表示向個(gè)8(2<SUP>3</SUP>)……</P>
<P><B>在C/C++中,很多計(jì)數(shù)的習(xí)慣都是從0開始</B>,所以,在你看明白上面那行內(nèi)容后,讓我們立刻改口換成下面的說法,以后我們只用這種說法:</P>
<P>二進(jìn)制數(shù):第<B>0</B>位數(shù)表示幾個(gè)1
(2<SUP>0</SUP>),第<B>1</B>位數(shù)表示幾個(gè)2(2<SUP>1</SUP>),第<B>3</B>位數(shù)表示幾個(gè)4(2<SUP>2</SUP>),第<B>4</B>位數(shù)表示向個(gè)8(2<SUP>3</SUP>)……</P>
<P>按照這種說法,我們可以發(fā)現(xiàn),從右向左數(shù),第n位數(shù)的權(quán)值 = 2的n次方。</P>
<P><B>二進(jìn)制各位權(quán)值的計(jì)算方法: 第n位權(quán)值 = 2<SUP>n</SUP></B></P>
<P> </P>
<P>下表詳細(xì)地表示 2進(jìn)制數(shù):11111111 是如何逐位計(jì)算,累加得到10進(jìn)制的值:</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"
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -