C C C 下基本型別所佔位數和取值範圍

2021-05-21 20:18:45 字數 3687 閱讀 5760

原文:http://hi.baidu.com/magicdemon/blog/item/821b2e22d7df494cad34debd.html

c++下基本型別所佔位數和取值範圍:

符號屬性      長度屬性      基本型      所佔位數      取值範圍   輸入符舉例       輸出符舉例

--                    --           char          8          -2^7 ~ 2^7-1    %c         %c、%d、%u

signed            --           char          8          -2^7 ~ 2^7-1    %c         %c、%d、%u

unsigned        --           char          8          0 ~ 2^8-1       %c         %c、%d、%u

[signed]        short        [int]         16         -2^15 ~ 2^15-1               %hd

unsigned       short        [int]         16         0 ~ 2^16-1              %hu、%ho、%hx

[signed]          --            int          32         -2^31 ~ 2^31-1               %d

unsigned          --           [int]         32         0 ~ 2^32-1               %u、%o、%x

[signed]          long         [int]         32         -2^31 ~ 2^31-1               %ld

unsigned         long         [int]         32         0 ~ 2^32-1              %lu、%lo、%lx

[signed]         long long    [int]         64         -2^63 ~ 2^63-1              %i64d

unsigned       long long    [int]         64         0 ~ 2^64-1           %i64u、%i64o、%i64x

--             --           float         32        +/- 3.40282e+038          %f、%e、%g

--             --           double        64        +/- 1.79769e+308   %lf、%le、%lg    %f、%e、%g

--             long         double        96        +/- 1.79769e+308         %lf、%le、%lg

幾點說明:

1. 注意! 表中的每一行,代表一種基本型別。「」代表可省略。

例如:char、signed char、unsigned char是三種互不相同的型別;

int、short、long也是三種互不相同的型別。

可以使用c++的函式過載特性進行驗證,如:

void func(char ch) {}

void func(signed char ch) {}

void func(unsigned char ch) {}

是三個不同的函式。

2. char/signed char/unsigned char型資料長度為1位元組;

char為有符號型,但與signed char是不同的型別。

注意! 並不是所有編譯器都這樣處理,char型資料長度不一定為1位元組,char也不一定為有符號型。

3. 將char/signed char轉換為int時,會對最高符號位1進行擴充套件,從而造成運算問題。

所以,如果要處理的資料中存在位元組值大於127的情況,使用unsigned char較為妥當。

程式中若涉及位運算,也應該使用unsigned型變數。

4. char/signed char/unsigned char輸出時,使用格式符%c(按字元方式);

或使用%d、%u、%x/%x、%o,按整數方式輸出;

輸入時,應使用%c,若使用整數方式,dev-c++會給出警告,不建議這樣使用。

5. int的長度,是16位還是32位,與編譯器字長有關。

16位編譯器(如tc使用的編譯器)下,int為16位;32位編譯器(如vc使用的編譯器cl.exe)下,int為32位。

6. 整型資料可以使用%d(有符號10進製)、%o(無符號8進製)或%x/%x(無符號16進製制)方式輸入輸出。

而格式符%u,表示unsigned,即無符號10進製方式。

7. 整型字首h表示short,l表示long。

輸入輸出short/unsigned short時,不建議直接使用int的格式符%d/%u等,要加字首h。

這個習慣性錯誤,**於tc。tc下,int的長度和預設符號屬性,都與short一致,

於是就把這兩種型別當成是相同的,都用int方式進行輸入輸出。

8. 關於long long型別的輸入輸出:

"%lld"和"%llu"是linux下gcc/g++用於long long int型別(64 bits)輸入輸出的格式符。

而"%i64d"和"%i64u"則是microsoft vc++庫里用於輸入輸出__int64型別的格式說明。

dev-c++使用的編譯器是mingw32,mingw32是x86-win32 gcc子專案之一,編譯器核心還是linux下的gcc。

進行函式引數型別檢查的是在編譯階段,gcc編譯器對格式字串進行檢查,顯然它不認得"%i64d",

所以將給出警告「unknown conversion type character `i' in format」。對於"%lld"和"%llu",gcc理所當然地接受了。

mingw32在編譯期間使用gcc的規則檢查語法,在連線和執行時使用的卻是microsoft庫。

這個庫里的printf和scanf函式當然不認識linux gcc下"%lld"和"%llu",但對"%i64d"和"%i64u",它則是樂意接受,並能正常工作的。

9. 浮點型資料輸入時可使用%f、%e/%e或%g/%g,scanf會根據輸入資料形式,自動處理。

輸出時可使用%f(普通方式)、%e/%e(指數方式)或%g/%g(自動選擇)。

10. 浮點引數壓棧的規則:float(4 位元組)型別擴充套件成double(8 位元組)入棧。

所以在輸入時,需要區分float(%f)與double(%lf),而在輸出時,用%f即可。

printf函式將按照double型的規則對壓入堆疊的float(已擴充套件成double)和double型資料進行輸出。

如果在輸出時指定%lf格式符,gcc/mingw32編譯器將給出乙個警告。

11. dev-c++(gcc/mingw32)可以選擇float的長度,是否與double一致。

12. 字首l表示long(double)。

雖然long double比double長4個位元組,但是表示的數值範圍卻是一樣的。

long double型別的長度、精度及表示範圍與所使用的編譯器、作業系統等有關。

c c 基本型別所佔位數

32位編譯器 char 1個位元組 char 即指標變數 4個位元組 32位的定址空間是2 32,即32個bit,也就是4個位元組。同理64位編譯器 short int 2個位元組 int 4個位元組 unsigned int 4個位元組 float 4個位元組 double 8個位元組 long ...

資料基本型別及對應基本型別類

基本資料型別 char 16位 byte 8位 short 16位 int 32位 long,float,double,boolean 基本資料型別對應類 character,byte,short,integer,long,float,double,boolean,string 幾乎所有型別類都有相...

oracle 基本型別

資料型別 引數描述 char n n 1 to 2000位元組 定長字串,n位元組長,如果不指定長度,預設為1個位元組長 乙個漢字為2位元組 varchar2 n n 1 to 4000位元組 可變長的字串,具體定義時指明最大長度n,這種資料型別可以放數字 字母以及ascii碼字符集 或者ebcdi...