C语言的类型大小
设计程序的时候我们一般会考虑的尽量的周全,尤其是像C这样的静态类型语言。
有一些溢出的问题就源于没有搞清楚变量的大小范围,所以我们编写的时候需要特别注意
C的整形(整数类型)大小
C的类型大小并没有明确的定义,类型的大小取决于它所用的编译器,所以说同一份代码,在不同平台下编译。有可能会有不一样的结果。
能确保的只有以下几点
- char 类型可以放小于等于127的值;
- short int 和int 可以存放小于等于32767的值;
- long int 可以保存小于等于2 147 483 647的值;
- char 至少有8位,short int 和int 至少有16位,而long int 则至少有32位。
如何确保声明的类型的大小范围符合预期
- 去查看该平台的大小定义,ANSI C中规定在该平台的头文件
<limits.h>
应该有明确的定义
或者可以自己编写程序测试
示例代码如下:
#include <stdio.h>
int main() {
int size_byte_of_char = sizeof(char);
int size_of_char = size_byte_of_char*8 - 1;
int size_byte_of_short = sizeof(short int);
int size_of_short = size_byte_of_short*8 - 1;
int size_byte_of_int = sizeof(int);
int size_of_int = size_byte_of_int*8 - 1;
long int size_byte_of_long = sizeof(long int);
long int size_of_long = size_byte_of_long*8 - 1;
printf("char size = %d\n",(1<<size_of_char) - 1);
printf("short size = %d\n",(1<<size_of_short) - 1);
printf("int size = %d\n",(1<<size_of_int) - 1);
printf("long size = %ld\n",(long)((1l<<size_of_long) - 1));
return 0;
}
64位系统下运行结果:
Kevin@~ $ gcc main.c -o intsize
Kevin@~ $ intsize ./intsize
char size = 127
short size = 32767
int size = 2147483647
long size = 9223372036854775807
- 在C语言中有些库帮我们做好这种事了
那就是<inttypes.h>
这里面用宏定义定义好了我们需要的大小的类型,例如int8_t、uint8_t、int16_t从8、16、32、64都有。
这个非常容易理解
8就是指长度为8位的整形,即最大127,最小-127。那么加个u就是无符号的8位整形,即,0~255。
16、32依此类推。
总结
总之,C是一门需要程序员多走一步的语言,它默认使用它的人懂得它的禁忌。
所以说C入门不难,但是深入理解它很难。只有实际碰到了才会知道它的各种特性。
最近实在有点懒,在这里对我的粉丝们说声对不起