平常做题如果不在意数据类型,输入的数据就容易超出定义的范围,导致WA。
所以今天来总结一下C语言常见的数据类型,包括其大小范围,输入输出符号。
大小范围
整型
int
整型变量,占用4字节,范围:-2的31次方~2的31次方-1。
※ 其区间长度,刚好是2的32次方。
short
短整型变量,占用2字节,范围:-2的15次方~2的15次方-1
※其区间长度,刚好是2的16次方。
long
即long int
长整型变量,占用4个字节,范围:-2的31次方~2的31次方-1。(二十亿,约)
※其区间长度,刚好是2的32次方。
※和int的大小相同,都占4字节,历史遗留问题。
long long
即long long int
占用8个字节,范围:-2的63次方~2的63次方-1。(九百亿亿,约)
※其区间长度,刚好是2的64次方。
实型
float
单精度实型,占用4个字节,范围从-10的38次方~10的38次方。
※其实最大值是1.1111111 1111111 11111111 x 。这个形式决定于实型变量在内存中的储存形式。(下次写)
其中有1个符号位,8个指数位,23个尾数位。
精度: = 8388608,最多能保证7位,至少能保证6位。
double
双精度实型,占用8个字节,范围从-10的308次方~10的10的308次方。
其中有1个符号位,11个指数位,52个尾数位。
精度: = 4503599627370496,一共16位,同理,最多16位,至少15位。
long double
长精度浮点类型,占用16个字节。
※查不到指数位和尾数位具体有多少,所以范围和精度也不知道。由于不同平台不一样,等我学会怎么用编译器自己查再来补充。
※在变量名前加入unsigned,会使变量在内存中的第一个bit位用来表示数据而不表示符号,因此数据可以更大,但是只能表示正数。需要注意的是,实型变量在内存中的第一个bit位规定要储存符号,因此实型变量不能加前缀unsigned。
字符类型
char
和整形变量有共通性,占用1个字节,储存的是ASCII码。
※ASCII码是7位的,1个字节有8bit,所以ASCII码第一位总是0,总共有 = 128种字符。
输入输出控制符
int | %d | 有符号的十进制整数 |
unsigned int | %o | 无符号的八进制整数 |
unsigned int | %u | 无符号的十进制整数 |
unsigned int | %x / %X | 无符号的十六进制整数(分别为大小写) |
float | 输入%f | 输出%f和%lf都行(%lf是C99之后的) |
double | 输入%lf | 同上 |
float & double | e / E | 科学计数法,基数为10 |
float & double | a / A | 16进制科学法,基数为2(以p表示) |
float & double | g / G | 有效位数。%.8g就是保留8位有效数字(似乎只能截取(四舍五入),不能补充。 |
char | c | 把储存的数字按照ASCII码转换为相应字符 |
char [] | s | 输出字符串中的字符直到字符串中的空字符,即\0 |
void* | p | 以16进制形式输出指针 |
int* | n | 到此字符之前,一共输出的字符个数。 |
关于以上提到的历史遗留问题:
C语言开始时只有 char(8位) 和 int(16位) 两种类型。
后来随着发展又把int分为了 short(16位) 和 long(32位) 两种,此时int具体是几位依赖于平台和后续的兼容性。
再后来当64位出现时,又添加了long long ,而为了规范,int逐渐稳定为32位。而long可以是32位或者64位。
C++标准上说long至少要和int一样大。并且整型变量有一下规范:
sizeof(char) == 1
sizeof(char) <= sizeof(short)
sizeof(short) <= sizeof(int)
sizeof(int) <= sizeof(long)
sizeof(long) <= sizeof(long long)
char和long long的范围一般不变,而其余的类型范围较灵活,与平台相关的,与实现相关。而如果要实现平台独立的话,在windows平台上,就有__intn可以使用,n代表位数。__int8 __int16 __int32 __int64。