亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

C 語言中的變量類型

對于 C 語言的變量類型這里有兩種說法:

一種是只包含基礎的變量類型,如整數型,浮點型等;另外一種則是在上述類型的基礎上還包含了一些用戶可以定義的復合的類型,如 array,structure 等等。

我們這里只介紹大家通常意義上所認識的前一種基本的 C 語言數據類型。更為復雜的這些數據組合的結構,我們會在后面單獨列出。

1. 變量類型

因為 C 語言與需要編譯之后才能執行,所以需要對變量指定類型后才能使用。因為 C 語言會對不同的數據類型分配不同的內存大小,這就是為什么 C 語言需要指定數據類型,而諸如 PHP, Python 這樣的語言不需要指定。指定大小的好處是可以讓程序處理起來更快,內存的開銷更小。

變量類型列表

類型 存儲長度 數值范圍
char 1 byte -128 to 127
unsigned char 1 byte 0 to 255
signed char 1 byte -128 to 127
int 4 bytes -2,147,483,648 to 2,147,483,647
unsigned int 4 bytes 0 to 4,294,967,295
short 2 bytes -32,768 to 32,767
unsigned short 2 bytes 0 to 65,535
long 8 bytes -9223372036854775808 to 9223372036854775807
unsigned long 8 bytes 0 to 18446744073709551615

對于用科學計數法表示的類型還涉及到小數可以表示的精度,也就是有效數字。請看下面的表格:

類型 存儲長度 數值范圍 小數點后的位數
float 4 byte 1.2E-38 to 3.4E+38 6
double 8 byte 2.3E-308 to 1.7E+308 15
long double 10 byte 3.4E-4932 to 1.1E+4932 19

這里有一個程序可以輸出你的計算機中的不同數據結構在內存中所占用的內存的位數。對于不同的硬件這個返回值是不同的。

實例演示
預覽 復制
復制成功!
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

    printf("CHAR_BIT    :   %d\n", CHAR_BIT);
    printf("CHAR_MAX    :   %d\n", CHAR_MAX);
    printf("CHAR_MIN    :   %d\n", CHAR_MIN);
    printf("INT_BIT     :   %d\n", sizeof(int));
    printf("INT_MAX     :   %d\n", INT_MAX);
    printf("INT_MIN     :   %d\n", INT_MIN);
    printf("LONG_BIT    :   %d\n", sizeof(long));
    printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
    printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
    printf("SCHAR_BIT   :   %d\n", sizeof(signed char));
    printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
    printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
    printf("SHRT_BIT    :   %d\n", sizeof(short));
    printf("SHRT_MAX    :   %d\n", SHRT_MAX);
    printf("SHRT_MIN    :   %d\n", SHRT_MIN);
    printf("UCHAR_BIT   :   %d\n", sizeof(unsigned char));
    printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
    printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
    printf("ULONG_BIT   :   %d\n", sizeof(unsigned long));
    printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
    printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);

    printf("Storage size for float :   %d \n", sizeof(float));
    printf("Strage size for double :   %d\n", sizeof(double));
    printf("FLT_MAX     :   %g\n", (float) FLT_MAX);
    printf("FLT_MIN     :   %g\n", (float) FLT_MIN);
    printf("-FLT_MAX    :   %g\n", (float) -FLT_MAX);
    printf("-FLT_MIN    :   %g\n", (float) -FLT_MIN);
    printf("DBL_MAX     :   %g\n", (double) DBL_MAX);
    printf("DBL_MIN     :   %g\n", (double) DBL_MIN);
    printf("-DBL_MAX    :   %g\n", (double) -DBL_MAX);
    printf("Float precision value   :   %d\n", FLT_DIG );
    printf("Double precision value  :   %d\n", DBL_DIG );

    return 0;
}
運行案例 點擊 "運行案例" 可查看在線運行效果

將上面的程序粘貼到文本編輯器中,然后以 test.c 文件名保存。

在終端命令行中輸入

gcc test.c -o test

編譯完成后

./test

來執行上面的程序。

我的樹莓派4上輸出的結果如下:

CHAR_BIT    :   8
CHAR_MAX    :   255
CHAR_MIN    :   0
INT_BIT     :   4
INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_BIT    :   4
LONG_MAX    :   2147483647
LONG_MIN    :   -2147483648
SCHAR_BIT   :   1
SCHAR_MAX   :   127
SCHAR_MIN   :   -128
SHRT_BIT    :   2
SHRT_MAX    :   32767
SHRT_MIN    :   -32768
UCHAR_BIT   :   1
UCHAR_MAX   :   255
UINT_MAX    :   4294967295
ULONG_BIT   :   4
ULONG_MAX   :   4294967295
USHRT_MAX   :   65535
Storage size for float :   4
Strage size for double :   8
FLT_MAX     :   3.40282e+38
FLT_MIN     :   1.17549e-38
-FLT_MAX    :   -3.40282e+38
-FLT_MIN    :   -1.17549e-38
DBL_MAX     :   1.79769e+308
DBL_MIN     :   2.22507e-308
-DBL_MAX    :   -1.79769e+308
Float precision value   :   6
Double precision value  :   15

這臺單板計算機的處理器是 arm64。

在樹莓派2上的輸出結果如下:

CHAR_BIT    :   8
CHAR_MAX    :   255
CHAR_MIN    :   0
INT_BIT     :   4
INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_BIT    :   4
LONG_MAX    :   2147483647
LONG_MIN    :   -2147483648
SCHAR_BIT   :   1
SCHAR_MAX   :   127
SCHAR_MIN   :   -128
SHRT_BIT    :   2
SHRT_MAX    :   32767
SHRT_MIN    :   -32768
UCHAR_BIT   :   1
UCHAR_MAX   :   255
UINT_MAX    :   4294967295
ULONG_BIT   :   4
ULONG_MAX   :   4294967295
USHRT_MAX   :   65535
Storage size for float :   4
Strage size for double :   8
FLT_MAX     :   3.40282e+38
FLT_MIN     :   1.17549e-38
-FLT_MAX    :   -3.40282e+38
-FLT_MIN    :   -1.17549e-38
DBL_MAX     :   1.79769e+308
DBL_MIN     :   2.22507e-308
-DBL_MAX    :   -1.79769e+308
Float precision value   :   6
Double precision value  :   15

這臺單板計算機的處理器是 arm32。

在我的筆記本電腦上運行的結果如下:

CHAR_BIT    :   8
CHAR_MAX    :   127
CHAR_MIN    :   -128
INT_BIT     :   4
INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_BIT    :   8
LONG_MAX    :   9223372036854775807
LONG_MIN    :   -9223372036854775808
SCHAR_BIT   :   1
SCHAR_MAX   :   127
SCHAR_MIN   :   -128
SHRT_BIT    :   2
SHRT_MAX    :   32767
SHRT_MIN    :   -32768
UCHAR_BIT   :   1
UCHAR_MAX   :   255
UINT_MAX    :   4294967295
ULONG_BIT   :   8
ULONG_MAX   :   18446744073709551615
USHRT_MAX   :   65535
Storage size for float :   4
Strage size for double :   8
FLT_MAX     :   3.40282e+38
FLT_MIN     :   1.17549e-38
-FLT_MAX    :   -3.40282e+38
-FLT_MIN    :   -1.17549e-38
DBL_MAX     :   1.79769e+308
DBL_MIN     :   2.22507e-308
-DBL_MAX    :   -1.79769e+308
Float precision value   :   6
Double precision value  :   15

這臺電腦的處理器是 x86_64 架構,也就是大家在市場上買到的家用電腦的架構。

大家可以看到這里有些數值是一樣的,但是有些卻不同。這就是計算機硬件上的差異,大家在使用 C 語言給硬件編程的時候一定要考慮到這點影響。

2. 小結

C 語言作為一種靜態語言,在變量使用之前,要確定變量的類型,用來分配在內存中所需要占用的空間。

C 語言的類型包含了有符號型和無符號型兩大類。有符號類型可以表示復數。而無符號類型只能表示從 0 開始的數值。

不同的計算機硬件體系結構,使得數值的表示范圍會發生變化。對于數值范圍敏感的程序,一定要處理好變量類型,防止數值過大造成程序錯誤。