6.C语言数据类型

文章目录

    • 6.1.1 数据类型
    • 6.1.2 整数类型:
    • 6.1.3 整数的内部表达:
    • 6.1.4 整数的范围
    • 6.1.4 整数的格式化
    • 6.1.5 选择整数类型
    • 6.1.7 浮点类型
    • 6.1.8 浮点的范围和精度
    • 6.1.9 字符类型
    • 6.1.10 逃逸字符
    • 6.1.11 类型转换
    • 6.2.1 逻辑类型
    • 6.2.2 逻辑运算
    • 6.2.3 条件运算和逗号运算

6.1.1 数据类型

  • C语言的变量,必须:
    在使用前定义,并且确定类型.
  • C以后的语言向两个方向发展:
    C++/Java更强调类型,对类型的检查更严格;
    JavaScript,Python,PHP不看重类型,甚至不需要事先定义.
  • 类型安全:
    • 支持强类型的观点认为明确的类型有助于尽早发现程序中的简单错误;
    • 反对强类型的观点认为过于强调类型迫使程序员面对底层,实现而非事务逻辑
    • 总的来说,早期语言强调类型,面向底层的语言强调类型;
    • C语言需要类型,但对类型的安全检查并不足够.
  • C语言的类型:
    • 整数
      char short int long longlong(c99)
    • 浮点数
      float double long double(c99)
    • 逻辑
      bool(c99)
    • 指针
    • 自定义类型
  • ps:前四种为基础类型
  • 类型有何不同:
    • 类型名称:int long double
    • 输入输出时的格式化:%d %ld %lf
      所表达的数的范围:char
    • 内存中所占据的大小:1个字节到16个字节
      char 1个字节 longdouble 16个字节
    • 内存中的表达形式:
      二进制(补码) 编码
      • 整数的为二进制,自然二进制或者二进制的补码
      • 浮点类型的是一种编码形式,不能直接拿来做运算
      • sizeof:
        是一个运算符,给出某个类型或者变量在内存中所占据的字节数
      • 注意:sizeof是静态运算符,它的结果在编译时刻就决定了
        不能在sizeof的括号里做运算,这些运算是不会做的
        eg:
        sizeof(int)=4
        sizeof(i)
#include
int main()
{
   
    int a;
   // a = 5;
    printf("sizeof(int)=%d\n", sizeof(int));
    printf("sizeof(a)%d\n", sizeof(a));

    return 0;
}

6.1.2 整数类型:

每一个类型的大小:
#include
int main()
{
   
    printf("sizeof(int)=%ld\n", sizeof(int));
    printf("sizeof(short)=%ld\n", sizeof(short));
    printf("sizeof(char)=%ld\n", sizeof(char));
    printf("sizeof(long)=%ld\n", sizeof(long));
    printf("sizeof(long long)=%ld\n", sizeof(long long));

    return 0;
}
  • char:1字节(8比特bit)
  • short:2字节
  • int:取决于编译器(CPU),通常的意义是"1个字"
    (用来表达寄存器的,不同的CPU上大小不同)
  • long:取决于编译器(CPU),通常的意义是"1个字"
  • long long:8字节

6.1.3 整数的内部表达:

  • 所有类型最终意义是我们怎么去看待它,而不是在内部是如何表达的
    计算机内部一切都是二进制:
    18–>00010010
    0–>00000000
    -18–>?
    • 如何表示负数:
      • 十进制用"-"来表示负数,在做计算的时候
      • 二进制负数:
        1个字节可以表达的数:
        00000000-11111111(0-255)
      • 三个方案:
        1.仿照十进制,有一个特殊的标志表示负数
        2.去中间的数为0,如1000000表示0,比它小的是负数,比它大的是正数
        3.补码
        • 意义:拿补码和原码可以加出一个溢出的"0"
        • 考虑-1,我们希望-1+1–>0,如何做到?
          0–>00000000
          1–>00000001
          11111111+00000001–>100000000
          ①计算机为8个比特,刚好多出来的那位就会被丢掉,1被丢掉,变为00000000
          因为0-1–>-1,所以,-1=(1)00000000-00000001–>111111111
          ②11111111被当做纯二进制看待时,是255,被当做补码看待时是-1.
          ③同理,对于-a,其补码就是0-a,实际2^n-5,n是这种类型的位数
  • ps:前两种存在局限性,比较复杂

6.1.4 整数的范围

  • 对于一个字节(8位),可以表达的是:
    00000000-11111111
    其中00000000–>0
    11111111-10000000–>-1 - -128
    00000001-01111111–>1-127
#include
int main()
{
   
    char i = 255;//最高位是11111111
    int j = 255;//00000000 00000000 00000000 11111111
    printf("%d %d", i, j);
    return 0;
}
  • 整数的范围:
    • char:1字节 -128 - 127
    • short:2字节: -32768 - 32767
    • int:取决于编译器(CPU),通常意义是"一个字" [-2^(32-1) - 2^(32-1)-1]
    • long:4字节
    • long long:8字节
    • ps:因为中间有个0,所以范围可以在-2^(n-1) - 2^(n-1)-1
  • unsigned:
    • (使这个整数不以补码形式出现,没有负数形式只有0和正整数部分,表达整数范围扩大2倍
    • 如果一个字面量常数想要表达自己是unsigned可以在后面加u或者U
      eg:266U
    • 用l或者L表示long(long)
      unsigned的初衷并非扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位
  • 整数越界:
    • 整数是以纯二进制方式进行计算的,所以:
      11111111+1–>100000000–>0
      01111111+1–>100000000–>-128
(1)
#include

你可能感兴趣的:(C语言,c语言,开发语言)