8.17.2013

Data type of C (III)

OK!! 終於到最後一部份了,原本以為這個主題應該很好寫;可是越到後面,發現能夠驗證和闡述的東西越來越多,所以就變成現在這樣,拆成三個部份來介紹。

這裡,要先提到的是longunsigned longlong longunsigned long long,範例和表示法如下:
#include <stdio.h>

int main(void) {

 long lnRet = 65535L;
 unsigned long ulRet = 32767UL;
 long long llnRet = 32767LL;
 unsigned long long ullnRet = 65535ULL;
 
 printf("lnRet = %ld \n", lnRet);
 printf("lnRet = %lo \n", lnRet);
 printf("lnRet = %lx \n", lnRet);
 printf("lnRet = %lX \n", lnRet);
 printf("\n");
 printf("ulRet = %lu \n", ulRet);
 printf("\n");
 printf("llnRet = %lld \n", llnRet);
 printf("llnRet = %llo \n", llnRet);
 printf("llnRet = %llx \n", llnRet);
 printf("llnRet = %llX \n", llnRet);
 printf("\n");
 printf("ullRet = %llu \n", ullRet);

 return 0;
}
最後一部份則是floatdoublelong double的範例:
#include <stdio.h>

int main(void) {

 float fRet = 32768.5F;
 double dRet = 65535.8;
 long double ldRet = 98304.3L;
 
 printf("fRet = %f \n", fRet);
 // fRet = 32768.500000
 printf("fRet = %e \n", fRet);
 // fRet = 3.276850e+04
 printf("fRet = %E \n", fRet);
 // fRet = 3.276850E+04
 printf("fRet = %g \n", fRet);
 // fRet = 32768.5
 printf("fRet = %G \n", fRet);
 // fRet = 32768.5
 printf("fRet = %a \n", fRet);
 // fRet = 0x1.0001p+15
 printf("fRet = %A \n", fRet);
 // fRet = 0X1.0001P+15
 printf("\n");
 printf("dRet = %lf \n", dRet);
 // dRet = 65535.800000
 printf("dRet = %le \n", dRet);
 // dRet = 6.553580e+04
 printf("dRet = %lE \n", dRet);
 // dRet = 6.553580E+04
 printf("dRet = %lg \n", dRet);
 // dRet = 65535.8
 printf("dRet = %lG \n", dRet);
 // dRet = 65535.8
 printf("dRet = %la \n", dRet);
 // dRet = 0x1.ffff99999999ap+15
 printf("dRet = %lA \n", dRet);
 // dRet = 0X1.ffff99999999AP+15
 printf("\n");
 printf("ldRet = %Lf \n", ldRet);
 // ldRet = 98304.300000
 printf("ldRet = %Le \n", ldRet);
 // ldRet = 9.830430e+04
 printf("ldRet = %LE \n", ldRet);
 // ldRet = 9.830430E+04
 printf("ldRet = %Lg \n", ldRet);
 // ldRet = 98304.3
 printf("ldRet = %LG \n", ldRet);
 // ldRet = 98304.3
 printf("ldRet = %La \n", ldRet);
 // ldRet = 0xc.000266666666666p+13
 printf("ldRet = %LA \n", ldRet);
 // ldRet = 0XC.000266666666666P+13

 return 0;
}
最後float、double和long double的部份稍為解釋一下:它們分別用關鍵字%f%lf%Lf來表示;預設的情況下,都是顯示到小數點以下第6位,同時也代表了它的精準度;假如只想顯示到小數點後2位的話,可以用%.02f,代表顯示到小數點後2位,不足2位者補0

%e (%E)的意思是─用科學記號法來表示。如:9.830430e+04就代表9.830430乘以10的4次方 (9.830430 * 10 ^ 4 = 9.830430 * 10,000 = 98304.30)。

%g (%G)的意思是由系統自行決定是否採用科學記號法來表示。

%a (%A)是C99的標準下針對浮點數、倍精數和雙倍精數所新增的表示法,會讓這些資料型態以16進制的方式輸出。

除此之外,還有一些奇奇怪怪地表示法:

%s: 顯示字串 (String),即針對資料型態為char *。

%p: 輸出此一變數的記憶體位址,例如:int a = 5; printf("%p \n", &a);

%n: 輸出至緩衝區的長度

%5d: 輸出格式為整數 (int),最少輸出5位

%06x: 輸出格式為16進制的整數,最少顯示6位,不足6位者補0。

%.07lf:輸出格式為倍精數 (double),顯示到小數點後7位,不足7位者補0。

%*d: 這種表示法,要帶兩個參數:int s = 10; printf("%*d \n", 5, s); 把s這個int列印出來,最少顯示5位。

%09.03Lf:輸出之資料型態為long double,最少顯示9位,不足9位者補0;小數點後最少顯示3位,不足3位者補0。

%*.*: int f = 10.63254F; printf("%*.* \n", 10, 2, f); 把f列印出來,最少顯示10位,顯示到小數點後2位。

%-: printf("%-5d \n", 10); 把10列印出來,最少顯示5位,且向左對齊

%#: 針對八進制和16進制的輸出,加上前置符號;如:%#o%#x%#X,輸出結果類似:015、0x12ab、0XCDEF。

大致上就是這些吧!!

Reference:
1. Data type of C (I)
2. Data type of C (II)

沒有留言:

張貼留言