1. 程式人生 > >C_Primer第3章 資料和C

C_Primer第3章 資料和C

本章介紹以下內容

關鍵字:int、short、long、unsigned、char、float、double、_Bool、_Complex、_Imaginary

運算子:sizeof()

函式:scanf()

整數型別和浮點型別的區別

如何書寫整形和浮點型常數,如何宣告這些型別的變數

如何使用printf()和scanf()函式讀寫不同型別的值

程式離不開資料。把數字、字母和文字輸入計算機,就是希望它利用這些資料完成某些任務。例如,需要計算一份利息或顯示一份葡萄灑商的排序列表。本章除了介紹如何讀取資料外,還將教會讀者如何操控資料。

C語言提供兩大系列的多種資料型別。本章詳細介紹兩大資料型別:整數型別和浮點數型別,講解這些資料型別是什麼、如何宣告它們、如何以及何時使用它們。除此之外,還將介紹常量和變數的區別。讀者很快就能看到第1個互動式程式。

3.1 示例程式

/*platinum.c --your weight in platinum*/
#include<stdio.h>
int main(void)
{
	float weight;
	float value;

	printf("Are you worth your weight in platinum?\n");
	printf("Let's check it out.\n");
	printf("Please enter your weight in pounds: ");

	scanf("%f",&weight);
	/*假設白金的價格是每盎司$1700*/
	/*14.5833用於把英磅常衡盎司轉換為金衡盎司*/
	value = 1700.0 * weight * 14.5833;
	printf("Your weight in platinum is worth $%.2f.\n",value);
	printf("you are easily worth that! If platinum prices drop,\n");
	printf("eat more to maintain your value.\n");
}

程式輸出

Are you worth your weight in platinum?
Let's check it out.
Please enter your weight in pounds: 156
Your weight in platinum is worth $3867491.25.
you are easily worth that! If platinum prices drop,
eat more to maintain your value.

程式調整

即使用第2章介紹的方法,在程式中新增下面的一行程式碼:

getchar();;

程式的輸出是否依舊在螢幕上一閃而過?本例,需要呼叫 兩次getchar()函式:

getchar();

getchar();

getchar()函式讀取下一個輸入字元,因此程式會等待使用者輸入,在這種情況下,鍵入156並按下Enter(或Return)鍵(傳送一個換行符),然後scanf()讀取鍵入的數字,第1個getchar()讀取換行符,第2個getchar()讓程式暫停,等待輸入。

3.1.1 程式中的新元素

3.2 變數常量資料

3.3 資料:資料型別關鍵字

不僅變數和常量不同,不同的資料型別之間也有差異。一些資料型別表示數字,一些數字型別表示字母(更普遍地諳是字元)。C通過識別一些基本的資料型別來區分和使用這些不同的資料型別。如果資料是常量,編譯器一般通過使用者書寫的形式來識別型別(如,42是整數,32.00是浮點數)。但是,對變數而言,要在宣告時指定其型別。盤後會詳細介紹如何宣告變數。現在,我們先來了解一下C語言的基本型別關鍵字。K&C給出了7個與型別相關的關鍵字。C90標準添加了2個關鍵字,C99標準又添加了3個關鍵字(見表3.1)。

在C語言中,用int關鍵字來表示基的整數型別。char關鍵字用於指定字母和其他字元(如,#、$、%和*)。

_Bool型別表示布林值,_complex和_Imaginary分別表示複數和虛數。 

難過這些關鍵字建立的型別,按計算機的儲存方式可分為兩大基本型別:整數型別和浮點數型別。

位、位元組和字

3.3.1 整數和浮點數

對我們而言,整數和浮點數的區別是它們的書寫方式不同,對計算機而言,它們的區別是儲存方式不同。下面詳細介紹整數和浮點數。

3.3.2 整數

和數字的概念一樣,在C語言中,整數是沒有小數部分的數。例如,2、-23和2345都是整數。而3.14、0.22和2.000都不是整數。計算機以二進位制數字儲存整數,例如,整數7以二進位制寫是111.因此,要在8位位元組中儲存該數字,需要把前5位都設定成0,後3位設定成1 (如圖3.2所示)。

3.2.3 浮點數

浮點數丐數學中實數的概念差不多。2.75、3.16E7、7.00和2e-8都是浮點數。注意,在一個值後面加上一個小數點,該 值就成為一個浮點值。所以,7是整數,7.00是浮點數。顯然,書寫浮點數有多種形式。稍後將詳細介紹e戶數法,這裡先做簡要介紹:3.16E7表示3.16\LARGE \times\LARGE 10^7(3.16乘以10的7次方)。其中,\LARGE 10^7=10000000,7被稱為10的指數。

這裡關鍵要理解浮點數和整數的儲存方案不同。計算機把浮點數分成小數部分和指數部分來表示,而且分開儲存這兩部分。因此,雖然7.00和7在數值上相同,但是儲存方式不同。在十進位制下,可以把7.0寫成0.7E1.這裡,0.7是晃眼數部分,1是指數部分。圖3.3演示了一個儲存浮點數的例子。當然,計算機在內部使用二進位制和2的冪進行儲存。而不是10的冪。第15章將詳述相關內容。現在,我們著重講解這兩種型別的實際區別。

  • 整數沒有小數部分,浮點數有小數部分。
  • 浮點數可以表示的範圍比整數大。參見本章末的表3.3.
  • 對於一些算術執行(如,兩個很大的數相減),浮點數損失的精度更多。
  • 因為在任何區間內(如,1.0到2.0之間)都存在無窮多個實數,所以計算機的浮點數不能表示區間內所有的值。浮點數通常只是實際值的近似值。例如,7.0可能被儲存為浮點值6.99999.稍後會討論更多精度方面的內容。

  • 過去,浮點運算比整數運算慢。不過,現在許多CPU都包含浮點處理器,縮小了速度上的差距。

3.4 C語言基本資料型別

本節將詳細介紹C語言的基本資料型別,包括如何宣告變數、如何表示字面值常量(如,5或2.78),以及典型的用法。一些老式的C語言編譯器無法支援這裡提到的所有型別,請查閱你使用的編譯器文件,瞭解可以使用哪些型別。

3.4.1 int型別

C語言提供了許多整數型別,為什麼一種型別不夠用?因為C 語言讓程式設計師針對不同情況選擇不同的型別。特別是,C語言中的整數型別要表示不同的取值範圍和正負值。一般情況使用int型別即可,但是為滿足特定任務和機器要求,還可以選擇其他型別。

int型別是有符號整型, 即int型別的值必須是整數,可以是正整數,負整數或零。其聚會範圍依計算機系統而異。一般而言,儲存一個int要佔用一個機器字長。ISO C規定int的取值範圍最小為-32768~32767.一般而言,系統用一個特殊位的值表示有符號整數的正負號。第15章將介紹常用的方法。

1.宣告int變數

2.初始化變數

3.int型別常量

C語言把大多數整形常量視為int型別,但是非常大的整數除外。詳見後面“long常量和long long 常量”小節對long int 型別的討論。

4.列印int值

可以使用printf()函式列印int型別的值。

程式清單3.2 print1.c程式

/*print1.c --演示printf()的一些特性*/
#include <stdio.h>
int main (void)
{
	int ten = 10;
	int two = 2;
	
	printf("Doing it right: ");
	printf("%d minus %d is %d\n",ten,2,ten-two);
	printf("Doing it wrong:");
	printf("%d minus %d is %d\n",ten);//遺漏2個引數
	return 0;
	
}

編譯並執行該程式,輸出如下:

Doing it right: 10 minus 2 is 8
Doing it wrong:10 minus 2 is 8

你可能會抱怨編譯器為何不能捕獲這種明顯的錯誤,但實際上問題出在printf()不尋常的設計。大部分函式都需要指定數目的引數,編譯器會檢查引數的數目是否正確。但是,printf()函式的引數數目不定,可以有1個、2個、3個或更多,編譯器也愛莫能助。記住,使用printf()函式時,要確保轉換說明的數量與待列印值的數量相等。

5.八進位制和十六進位制

程式清單3.3 bases.c程式

/* bases.c --以十進位制、八進位制、十六進位制列印十進位制100*/
#include <stdio.h>
int main(void)
{
	int x = 100;

	printf("dec = %d; octal = %o; hex = %x\n",x,x,x);
	printf("dec = %d; octal = %#o; hex = %#x\n",x,x,x);
	printf("dec = %d; octal = %#o; hex = %#X\n",x,x,x);

	return 0;
}

編譯並執行該程式,輸出如下:

dec = 100; octal = 144; hex = 64
dec = 100; octal = 0144; hex = 0x64
dec = 100; octal = 0144; hex = 0X64

該程式以3種不同記數系統顯示同一個值。printf()函式做了相應的轉換。注意,如果要在八進位制和十六進位制前顯示0和0x字首,要分別在轉換說明中加入#。

3.4.2 其他整數型別

整數溢位

 程式清單toobig.c

#include <stdio.h>
int main(void)
{
	int i = 2147483647;//有符號32位最大值。範圍[-2147483648---2147483647]
	unsigned int j = 4294967295;//無符號32位最大值。範圍[0---4294967295]

	printf("%d %d %d\n ",i,i+1,i+2);
	printf("%u %u %u\n ",j,j+1,j+2);

	return 0;

}

輸出結果:

2147483647 -2147483648 -2147483647
 4294967295 0 1

可以把無符號整數j看作是汽車的里程錶。當達到它能表示的最大值時,會重新從起始點開始。整數i也是類似的情況。它們主要的區別是,在超過最大值時,unsigned int型別的變數j 從0開始;而int型別的變數i則從-214783648開始。注意,當i超出(溢位)其相應型別所能表示地的最大值時,系統並未通知使用者。因此,在程式設計時必須自己注意這類問題。

溢位行為是未定義的行為,C標準並未定義有符號型別的溢位規則。以上描述的溢位行為比較有代表性,但是也可能會出現其他情況。
 

+++++++++++++++++++++

補數
假設當前時針指向11點,而準確時間是8點,調整時間可有以下兩種撥法:

  • 一種是倒撥3小時,即:11-3=8
  • 另一種是順撥9小時:11+9=12+8=8

在以模為12的系統中,加9和減3效果是一樣的,因此凡是減3運算,都可以用加9來代替。對“模”12而言,9和3互為補數(二者相加等於模)。所以我們可以得出一個結論,即在有模的計量系統中,減一個數等於加上它的補數,從而實現將減法運算轉化為加法運算的目的。

計算機上的補碼就是算術裡的補數。 

設我們有一個 4 位的計算機,則其計量範圍即模是 
2^4 = 16,所以其能夠表示的範圍是0~15,現在以計算 5 - 3為例,我們知道在計算機中,加法器實現最簡單,所以很多運算最終都要轉為加法運算,因此5-3就要轉化為加法:

 # 按以上理論,減一個數等於加上它的補數,所以
 5 - 3
 # 等價於 
 5 + (16 - 3)   // 算術運算單元將減法轉化為加法
 # 用二進位制表示則為:
 0101 + (10000 - 0011)
 # 等價於
 0101 + ((1 + 1111) - 0011)
 # 等價於
 0101 + (1 + (1111 - 0011))
 # 等價於
 0101 + (1 + 1100) // 括號內是3(0011)的反碼+1,正是補碼的定義
 # 等價於
 0101 + 1101
 # 所以從這裡可以得到
 -3 = 1101
 # 即 `-3` 在計算機中的二進位制表示為 `1101`,正是“ -3 的正值 3(`0011`)的補碼(`1101`)”。
 # 最後一步 0101 + 1101 等於
 10010

+++++++++++++++++++++

4、列印short、long、long long和unsigned型別

列印unsigned int型別的值,使用%u轉換說明;列印long型別的值,使用%ld轉換說明。如果系統中int 和long的大小相同,使用%d就行。但是,這樣的程式被移植到其他系統(int和long型別的大小不同)中會無法正常工作。在x和o前面可以使用l字首,%lx表示以十六進位制格式列印long型別整數,%lo表示以八進位制格式列印long型別整數。注意,雖然C允許使用大寫或小寫的常量字尾,但是在轉換說明中只能使用小寫。

C語言中有多種printf()格式。對於short型別,可以使用 h字首。%hd表示以十進位制顯示short型別的整數,%ho表示以八進位制顯示short型別的整數。h和l字首都可以和u一起使用,用於表示無符號型別。例如,%lu表示列印unsigned long型別值。程式清單3.4i演示了一些例子。對於支援long long型別的系統,%lld和%llu分別表示有符號和無符號型別。第4章將詳細介紹轉換說明。

#include <stdio.h>
int main (void)
{
    unsigned int un = 3000000000;
    short end = 200;
    long big = 65537;
    long long verybig = 12345678908642;
    printf("un = %u and not %d\n", un,un);
    printf("end = %hd and %d\n",end,end);
    printf("big = %ld and not %hd\n",big,big);
    printf("verybig= %lld and not %ld\n",verybig,verybig);

    return 0;
}

程式輸出結果

un = 3000000000 and not -1294967296
end = 200 and 200
big = 65537 and not 1
verybig= 12345678908642 and not 1942899938


有符號32位最大值。範圍[-2147483648---2147483647]
無符號32位最大值。範圍[0---4294967295]

 

3000000000的原碼:1011 0010 1101 0000 0101 1110 0000 0000

1294967296的原碼:0100 1101 0010 1111 1010 0010 0000 0000

1294967296的反碼:1011 0010 1101 0000 0101 1101 1111 1111

1294967296的補碼:1011 0010 1101 0000 0101 1110 0000 0000

該例表明,使用錯誤的轉換說明會得到意想不到的結果。第1行輸出,對於無符號變數un,使用%d會生成負值!基原因是,無符號值3000000000,和有符號值-1294967296在系統記憶體中的內部表示完全相同。因些,如果告訴printf()該數是無符號數,它列印一個值:如果告訴它該數是有符號數,它將列印另一個值。在待列印的值大於有符號值的最大值時,會發生這種情況。對於較小的正數(如96),有符號和無符號型別的儲存、顯示都相同。

第2行輸出,對於short型別的變數end,在printf()中無論指定以short型別(%hd)還是int型別(%d)列印,打印出來的值都相同。這是因為在給函式傳遞引數時,C編譯器把short型別的值自動轉換成int型別的值。你可能會提出疑問:為什麼要進行轉換?h修飾符有什麼用?第1個問題的答案是,int型別被認為是計算機處理整數型別時最高效的型別。因此,在short和int型別的大小不同的計算機中,用int型別的引數傳遞速度更快。第2個問題的答案是,使用h修飾符可以顯示較大整數被截斷成short型別值的情況。第3行輸出就演示了這種情況。把65537以二進位制格式寫成一個32位數是0000 0000 0000  0001 0000 0000 0000 0001。使用%hd,printf()只會檢視後16位,所顯示的值是1。與此類似,輸出的最後一行先顯示了verybig的完整值,然後由於使用了%ld,printf()只顯示了儲存在後32位的值。

本章前面介紹過,程式設計師必須確保轉換說明的數量和待列印值的數量相同。以上內容也是提醒讀者,程式設計師還必須根據待列印值的型別使用正確的轉換說明。

提示:匹配printf(()說明符的型別

在使用printf()函式時,切記檢查每個待列印值都對就的轉換說明,還要檢查轉換說明的型別是否與待列印值的型別相匹配。

3.4.3 使用字元:char型別

char 型別用於儲存字元(如,字母或標點符號),但是從技術層面看,char是整數型別。因為char型別實際上儲存的是整數而不是字元。計算機使用數字編碼來處理字元,即用特定的整數表示特定的字元。美國最常用的編碼是ASCII編碼,本書也使用此編碼。例如,在ASCII碼中,整數65代表大寫字母A。因此儲存字母A實際上儲存的是整數65(許多IBM的大型主機使用另一種編碼------EBCDIC,其原理相同)。另外,其他國家的計算機系統可能使用完全不同的編碼)。

標準ASCII碼的範圍是0`127,只需7位二進位制數即可表示。通常,char型別被定義為8位的儲存單元,因此容納標準ASCII碼綽綽有餘。許多其他系統(如IMB PC和蘋果Macs)還提供擴充套件ASCII碼,也在8位的表示範圍之內。一般而言,C語言會保證char型別足夠大,以儲存系統( 實現C語言的系統)的基本字符集。

許多字符集都超過了127,甚至多於255.例如,日本漢字(kanji)字符集。商用的統一碼(Unicode)建立了一個能表示世界範圍內多種字元的系統,目前包括的字元已超過110000個。國際標準化組織(ISO)和國際電工技術委員會(IEC)為字符集開發了ISO/IEC 1066標準。統一碼標準也與ISO/IEC 10646標準相容。

C語言把1位元組定義為char型別佔用的位(bit)數,因此無論是16位還是32位系統,都可以使用char型別。

1.宣告char型別變數

char response;

char itable,latan;

2.字元常量和初始化

如果要把一個字元常量初始化為字母A,不必背下ASCII碼,用計算機語言很容易做到。通過以下初始化字母A賦給grade即可:

char grade = 'A';

在C語言中,用單引號括起來的單個字元被稱為字元常量(character cnstant)。編譯器一發現‘A’,就會將其轉換成相應的程式碼值。單引號必不可少。下面還有一些其他的例子:

char broiled;/*宣告一個char型別的變數*/

broiled = 'T'/*為其賦值,正確*/

broiled = T;/*錯誤!此時T是一個變數*/

broiled = "T";/*錯誤! 此時“T"是一個字串*/

實際上,字元是以數值形式儲存的,所以也可使用數字程式碼值來賦值:

char grade = 65;/*對於ASCII,這樣做沒問題,但這是一種不好的程式設計風格*/

在本例中,雖然65是int型別,但是它在char型別能表示的範圍內,所以將其賦值給grade沒問題。由於65是字母A對應的ASCII對應的ASCII碼。因此本例是把A賦給grade。注意,能這樣做的前提上系統使用ASCII碼。其實,用‘A’代替65才是較妥當的做法,這樣在任何系統中都不會出問題。因此,最好使用字元常量,而不是數字程式碼值。

奇怪的是,C語言將字元常量視為int型別而非char型別。例如,在int為32位、char為8位的ASCII系統中,有下面的程式碼:

char grade = 'B';

本來'B'對就的數值66儲存在32位的儲存單元中,現在卻可以儲存在8位的儲存單元中(grade) 。利用字元常量的這種特性,可以定義一個字元常量'FATE',即把4個獨立的8位ASCII碼儲存在一個32位儲存單元中。如果把這樣的字元常量賦給char型別變數gradde, 只有最後8位有效。因此,grade的值是'E'。

3. 非列印字元

/*非列印字元 \a,蜂鳴聲*/
#include <stdio.h>
int main(void)
{	char beep = 7;
	char beep1 = '\7'; /*八進位制ASCII表示一個字元 \007,\07,\7都可以*/
	char beep2 = '\a';
	printf("beep %c\n",beep);
	printf("beep %c\n",beep1);
	printf("beep %c\n",beep2);
	printf("Gramps sez, \" \\ is a backslash.\"\n");/*輸出 Gramps sez, " \ is a backslash." */
	printf("Hello!\007\n");
	printf("Hello!7\n");	
	return 0;
	
}

使用ASCII碼時,注意數字和數字字元的區別。例如,字元4對就的AACII碼是52。'4'表示字元4,而不是數值4。

關於黑方序列,讀者可能有下面3個問題。

上面的例子( printf("Gramps sez, \" \\ is a backslash.\"\n"); ),為何沒有用單引號把轉義序列括起來?無論是普通字元還是轉義序列,只要是雙引號括起來的字元集合,就無需用單引號括起來。雙引號中的字符集俁叫作字串。

何時使用SACII碼?何時使用轉義序列?如果要在轉義序列(假設使用‘\f’)和ASCII碼(‘\014’)之間選擇,請選擇前者(即'\f')..這樣的寫法不僅更好記,而且可自然醒性更高。'\f’在不使用ASCII碼的系統中,仍然有效。

如果要使用ASCII碼,為何要寫成‘032’而不是032?首先,‘032’能更清晰地表達程式設計師使用字元編碼的意圖。其次,類似\032這樣的轉義序列可以嵌入C的字串中,如printf(“Hello!\007\n”);中就嵌入了\007。

4.列印字元

/*charcode.c --顯示字元的程式碼編號*/
#include <stdio.h>
int main(void)
{	
	char ch;

	printf("Please enter a character.\n");
	scanf("%c",&ch);/* 使用者輸入字元 */
	printf("The code for S%c is %d.\n",ch,ch);
	return 0;
	
}

輸出結果如下:

Please enter a character.
C
The code for SC is 67.

執行該 程式,在輸入字母后不要忘記按下Enter或Return鍵。隨後,scanf()函式會讀取使用者輸入的字元,&符號表示把輸入的字元賦給變數ch。接著,printf()函式列印ch的值兩次,第1次列印一個字元(對應程式碼中的%c).第2次列印一個十進位制整數值(對應程式碼中的%d)。注意,printf()函式中的轉換說明決定了資料的顯示方式,而不是資料的儲存方式(見圖3.6)。

5. 有符號還是無符號

有此C編譯器把char實現為有符號型別,這意味著char可表示的範圍是-128到127.而有些C編譯器char實現為無符號型別,那麼char可表示的範圍是0~255. 

3.4.4 _Bool型別

C99標準添加了_Bool型別,用於表示布林值,即邏輯值true 和false。

3.4.5 可移植型別: stdint.h和inttypes.h

C語言提供了許多有用的整數型別。但是,某些型別名在不同系統中的功能不一樣,C99新增了兩個標頭檔案stdint.h和inttypes.h,以確保C語言的型別在各系統中的功能相同。

C語言為現有型別建立了更多型別名。這些新的型別名定義在stdint.h標頭檔案中。例如,int32_t表示32位有符號號數型別。在使用32位int的系統中,標頭檔案會把int32_t作為int的別名。不同的系統也可以定義相同的型別名。例如,int為16位、long為32位的系統會把int32_t作為long的別名。然後,使用int32_t型別編寫程式,幷包含stdio.h標頭檔案,編譯器會把int或long替換成與當前系統匹配的型別。

精確寬度整數型別(exact-width integer type)

最小寬度型別(minimum width type)

最快最小寬度型別(fastst minimun width type)

字串巨集(例如PRId32)

 

/* altnames.c --可移植整數型別名*/
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
	int32_t me32; //me32是一個32位有符號整型變數
	
	me32 = 45933945;
	
	printf("INT_8_MAX : %d\n",INT8_MAX);
	printf("INT_8_MAX : %" PRId8 "\n",INT8_MAX);
	
	printf("INT_16_MAX : %d\n",INT16_MAX);
	printf("INT_16_MAX : %" PRId16 "\n",INT16_MAX);
	
	printf("INT_32_MAX : %d\n",INT32_MAX);
	printf("INT_32_MAX : %" PRId32 "\n",INT32_MAX);
	
	printf("INT_64_MAX : %lld\n",INT64_MAX);
	printf("INT_64_MAX : %" PRId64 "\n",INT64_MAX);
	
	printf("INT_LEAST8_MAX : %d\n",INT_LEAST8_MAX);
	printf("INT_LEAST8_MAX : %" PRIdLEAST8 "\n",INT_LEAST8_MAX);
	
	printf("INT_LEAST16_MAX : %d\n",INT_LEAST16_MAX);
	printf("INT_LEAST16_MAX : %" PRIdLEAST16 "\n",INT_LEAST16_MAX);
	
	
	printf("INT_FAST32_MAX : %d\n",INT_FAST32_MAX);
	printf("INT_FAST32_MAX : %" PRIdFAST32 "\n",INT_FAST32_MAX);
	
	printf("First ,assume int32_t is int:");
	printf("me32 = %d\n",me32);
	printf("Next,let's not make any assumptions.\n");
	printf("Instead,use a \"macro\" from inttypes.h: ");
	printf("me32 = %" PRId32 "\n",me32);
	
	return 0;
	
}

程式輸出
INT_8_MAX : 127
INT_8_MAX : 127
INT_16_MAX : 32767
INT_16_MAX : 32767
INT_32_MAX : 2147483647
INT_32_MAX : 2147483647
INT_64_MAX : 9223372036854775807
INT_64_MAX : 9223372036854775807
INT_LEAST8_MAX : 127
INT_LEAST8_MAX : 127
INT_LEAST16_MAX : 32767
INT_LEAST16_MAX : 32767
INT_FAST32_MAX : 2147483647
INT_FAST32_MAX : 2147483647
First ,assume int32_t is int:me32 = 45933945
Next,let's not make any assumptions.
Instead,use a "macro" from inttypes.h: me32 = 45933945

3.4.6 float、double和long double

float型別必須至少能表示6位有效數字。

double型別和float型別的最小取值範圍相同,但至少必須表示10位有效數字。

long double型別運至少下double型別的精度相同。

1.宣告浮點型變數

float noat,jonah;

double trouble;

float planck = 6.63e-34;

long double gnp;

2.浮點型常量

-1.56E+12

2.77e-3

3.14159

.2

4e16

.8E-5

100.

不要在浮點型別常量中間加空格:1.56 E+12 (錯誤!)

建議使用L字尾,因為字母l和數字1很容易混淆。沒有後綴的浮點型常量是double型別。

C99標準添加了一種新的浮點型常量格式------用十六製表示浮點型常量,即在十六進位制數前加上十六進位制字首(0x或)X),用p和P分別代替e和E,用2的冪代替10的冪( 即,p計數法)。如下所示:

0xa.1fp10