数据类型

基础

  • 二进制不能表示所有的小数,他只是选一个离需表示值的最近的一个数进行储存而已。
  • 首先,在计算机中所有数据都是用一个一个的二进制位(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^72^7-1 %c %c、%d、%u
    signedchar 8 -2^72^7-1 %c %c、%d、%u
    unsignedchar 8 02^8-1 %c %c、%d、%u
    [signed] short [int] 16 -2^152^15-1 %hd %hd
    unsigned short [int] 16 02^16-1 %hu、%ho、%hx %hu、%ho、%hx

    [signed] 无 int 32 -2^312^31-1 %d %d
    Unsigned 无 [int] 32 02^32-1 %u、%o、%x %u、%o、%x
    [signed] long [int] 32 -2^312^31-1 %ld %ld
    unsigned long [int] 32 02^32-1 %lu、%lo、%lx %lu、%lo、%lx
    [signed] longlong [int] 64 -2^632^63-1 %I64d %I64d
    unsigned longlong [int] 64 -2^632^63-1 %I64d %I64d
    unsigned longlong [int] 6402^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)的一段不连续的空间。理论上则是硬盘大小。
------ The Happy Ending ------