C 語言中的變量類型
對于 C 語言的變量類型這里有兩種說法:
一種是只包含基礎(chǔ)的變量類型,如整數(shù)型,浮點(diǎn)型等;另外一種則是在上述類型的基礎(chǔ)上還包含了一些用戶可以定義的復(fù)合的類型,如 array,structure 等等。
我們這里只介紹大家通常意義上所認(rèn)識的前一種基本的 C 語言數(shù)據(jù)類型。更為復(fù)雜的這些數(shù)據(jù)組合的結(jié)構(gòu),我們會在后面單獨(dú)列出。
1. 變量類型
因?yàn)?C 語言與需要編譯之后才能執(zhí)行,所以需要對變量指定類型后才能使用。因?yàn)?C 語言會對不同的數(shù)據(jù)類型分配不同的內(nèi)存大小,這就是為什么 C 語言需要指定數(shù)據(jù)類型,而諸如 PHP, Python 這樣的語言不需要指定。指定大小的好處是可以讓程序處理起來更快,內(nèi)存的開銷更小。
變量類型列表
類型 | 存儲長度 | 數(shù)值范圍 |
---|---|---|
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 |
對于用科學(xué)計(jì)數(shù)法表示的類型還涉及到小數(shù)可以表示的精度,也就是有效數(shù)字。請看下面的表格:
類型 | 存儲長度 | 數(shù)值范圍 | 小數(shù)點(diǎn)后的位數(shù) |
---|---|---|---|
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 |
這里有一個程序可以輸出你的計(jì)算機(jī)中的不同數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中所占用的內(nèi)存的位數(shù)。對于不同的硬件這個返回值是不同的。
#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
來執(zhí)行上面的程序。
我的樹莓派4上輸出的結(jié)果如下:
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
這臺單板計(jì)算機(jī)的處理器是 arm64。
在樹莓派2上的輸出結(jié)果如下:
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
這臺單板計(jì)算機(jī)的處理器是 arm32。
在我的筆記本電腦上運(yùn)行的結(jié)果如下:
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 架構(gòu),也就是大家在市場上買到的家用電腦的架構(gòu)。
大家可以看到這里有些數(shù)值是一樣的,但是有些卻不同。這就是計(jì)算機(jī)硬件上的差異,大家在使用 C 語言給硬件編程的時候一定要考慮到這點(diǎn)影響。
2. 小結(jié)
C 語言作為一種靜態(tài)語言,在變量使用之前,要確定變量的類型,用來分配在內(nèi)存中所需要占用的空間。
C 語言的類型包含了有符號型和無符號型兩大類。有符號類型可以表示復(fù)數(shù)。而無符號類型只能表示從 0 開始的數(shù)值。
不同的計(jì)算機(jī)硬件體系結(jié)構(gòu),使得數(shù)值的表示范圍會發(fā)生變化。對于數(shù)值范圍敏感的程序,一定要處理好變量類型,防止數(shù)值過大造成程序錯誤。