基础
- 二进制不能表示所有的小数,他只是选一个离需表示值的最近的一个数进行储存而已。
- 首先,在计算机中所有数据都是用一个一个的二进制位(0或1)存储的,单位称为:位(bit);然后,每8位二进制数(比如01010001)代表一个字节(byte)大小,即1字节=8位;再然后,C语言每个数据类型都是有固定字节大小的,比如char类型是一个字节即8位,而int类型的大小与具体计算机cpu的机器字长有关,如果是16位cpu,int类型就是2字节=16位大小,如果是32位cpu,int类型就是4字节=32位大小;最后,每个数据类型的取值范围就是由其字节大小决定的,如char类型的取值范围是-2^7 ~ 2^7-1(涉及到二进制数与十进制数之间的转换方面的知识,此处不再讲,详情可查阅相关进制换算资料)。
- 数据类型,指针字节大小与编译器有关,指针还与其它因素有关(笔记本上)
数据类型
- 输出有e时,可能是输出变量类型float,double的问题,可改为int其它类型试试
- int类型不会出现浮点数,不要用int型存计算结果的浮点数
- short的取值范围为-32768~32767(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647)(-2的31次方到2的31次方-1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输出符举例
无 无 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 %hd
unsigned short [int] 16 0 ~2^16-1 %hu、%ho、%hx %hu、%ho、%hx
[signed] 无 int 32 -2^31 ~ 2^31-1 %d %d
Unsigned 无 [int] 32 0 ~ 2^32-1 %u、%o、%x %u、%o、%x
[signed] long [int] 32 -2^31 ~ 2^31-1 %ld %ld
unsigned long [int] 32 0 ~ 2^32-1 %lu、%lo、%lx %lu、%lo、%lx
[signed] longlong [int] 64 -2^63 ~ 2^63-1 %I64d %I64d
unsigned longlong [int] 64 -2^63 ~ 2^63-1 %I64d %I64d
unsigned longlong [int] 640 ~ 2^64-1 %I64u、%I64o、%I64x %I64u、%I64o、%I64x
无 无 float 32 +/-3.40282e+038 %f、%e、%g %f、%e、%g
无 无 double 64 +/-1.79769e+308 %lf、%le、%lg %f、%e、%g
无 long double 96 +/- 1.79769e+308 %Lf、%Le、%Lg %Lf、%Le、%Lg将char/signed char转换为int时,会对最高符号位1进行扩展,从而造成运算问题。所以,如果要处理的数据中存在字节值大于127的情况,使用unsigned char较为妥当。程序中若涉及位运算,也应该使用unsigned型变量。
- c中规定除法相除必须是整数,但表达式存在自动转换,若两个数字都为int,将其中一个数字强制类型转换为浮点数,即可保留小数
数组范围
函数内申请的变量,数组,是在栈(stack)中申请的一段连续的空间。栈的默认大小为2M或1M,开的比较小。
全局变量,全局数组,静态数组(static)则是开在全局区(静态区)(static)。大小为G单位,所以能够开的很大。
- 如
int num[900][900]; - 计算公式:900 900sizeof(int)/1024 = 3164KB=3MB > 2MB所以溢出
- 而malloc、new出的空间,则是开在堆(heap)的一段不连续的空间。理论上则是硬盘大小。