【C语言】数据类型-002

第二章 数据类型

2.1 常量与变量

2.1.1 关键字

2.2.2 八进制

八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。

八进制的数和二进制数可以按位对应( 八进制一位对应二进制三位 ),因此常应用在计算机语言中。

2.2.3 十六进制

十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成, 字母不区分大小写 。与10进制的对应关系是:0-9对应0-9,A-F对应10-15。

十六进制的数和二进制数可以按位对应( 十六进制一位对应二进制四位 ),因此常应用在计算机语言中。
int a = 123; //十进制方式赋值 int b = 0123; //八进制方式赋值, 以数字0开头 int c = 0xABC; //十六进制方式赋值 //如果在printf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x printf("十进制:%d\n",a ); printf("八进制:%o\n", b); //%o,为字母o,不是数字 printf("十六进制:%x\n", c); return 0;

2.3 计算机内存数值存储方式

2.3.1 原码

一个数的原码(原始的二进制码)有如下特点:

  • 最高位做为符号位,0表示正,为1表示负
  • 其它数值部分就是数值本身绝对值的二进制数
  • 负数的原码是在其绝对值的基础上,最高位变为1
  • 下面数值以1字节的大小描述:

    原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算。

    2.3.2 反码

  • 对于正数,反码与原码相同
  • 对于负数,符号位不变,其它部分取反(1变0,0变1)
  • //结果为 fffffff1 //fffffff1对应的二进制:1111 1111 1111 1111 1111 1111 1111 0001 //符号位不变,其它取反:1000 0000 0000 0000 0000 0000 0000 1110 //上面加1:1000 0000 0000 0000 0000 0000 0000 1111 最高位1代表负数,就是-15 return 0;

    2.3.4 补码的意义

    示例1:用8位二进制数分别表示+0和-0

    int a = 123; //定义变量a,以10进制方式赋值为123 int b = 0567; //定义变量b,以8进制方式赋值为0567 int c = 0xabc; //定义变量c,以16进制方式赋值为0xabc printf("a = %d\n", a); printf("8进制:b = %o\n", b); printf("10进制:b = %d\n", b); printf("16进制:c = %x\n", c); printf("16进制:c = %X\n", c); printf("10进制:c = %d\n", c); unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值 printf("有符号方式打印:d = %d\n", d); // d=-1 printf("无符号方式打印:d = %u\n", d); // d=4294967295 return 0;

    2.5.2 整型变量的输入

    #include <stdio.h>
    int main()
        int a;
        printf("请输入a的值:");
        //不要加“\n”
        scanf("%d", &a);
        printf("a = %d\n", a); //打印a的值
        return 0;
    

    2.5.3 short、int、long、long long

  • 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能短于 int 类型。
  • 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
  • printf("sizeof(a) = %u\n", sizeof(a)); printf("sizeof(b) = %u\n", sizeof(b)); printf("sizeof(c) = %u\n", sizeof(c)); printf("sizeof(c) = %u\n", sizeof(d)); printf("short a = %hd\n", a); printf("int b = %d\n", b); printf("long c = %ld\n", c); printf("long long d = %lld\n", d); unsigned short a2 = 20u; unsigned int b2 = 20u; unsigned long c2= 20ul; unsigned long long d2 = 20ull; printf("unsigned short a = %hu\n", a2); printf("unsigned int b = %u\n", b2); printf("unsigned long c = %lu\n", c2); printf("unsigned long long d = %llu\n", d2); return 0;

    2.5.4 有符号数和无符号数区别

    1.有符号数
    有符号数是最高位为符号位,0代表正数,1代表负数。
    printf("%X\n", a); //结果为 BF0FF0BA //B F 0 F F 0 B A //1011 1111 0000 1111 1111 0000 1011 1010 return 0;

    2.无符号数
    无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。

    2.6.1 字符变量的定义和输出

    字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来。

    字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型

    #include <stdio.h>
    int main()
        char ch = 'a';
        printf("sizeof(ch) = %u\n", sizeof(ch));
        printf("ch[%%c] = %c\n", ch); //打印字符
        printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值
        char A = 'A';
        char a = 'a';
        printf("a = %d\n", a);      //97
        printf("A = %d\n", A);  //65
        printf("A = %c\n", 'a' - 32); //小写a转大写A
        printf("a = %c\n", 'A' + 32); //大写A转小写a
        ch = ' ';
        printf("空字符:%d\n", ch); //空字符ASCII的值为32
        printf("A = %c\n", 'a' - ' '); //小写a转大写A
        printf("a = %c\n", 'A' + ' '); //大写A转小写a
        return 0;
    

    2.6.2 字符变量的输入

    #include <stdio.h>
    int main()
        char ch;
        printf("请输入ch的值:");
        //不要加“\n”
        scanf("%c", &ch);
        printf("ch = %c\n", ch); //打印ch的字符
        return 0;
    

    2.6.2 ASCII对照表

    ASCII值 ASCII值 ASCII值 ASCII值
  • ASCII 非打印控制字符: ASCII 表上的数字 0-31 分配给了控制字符,用于控制像打印机等一些外围设备。
  • ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字 127 代表 Del 命令。
  • 2.6.3 转义字符

    ASCII码值(十进制) printf("\befg\n");//\b为退格键, \n为换行键 printf("%d\n", '\123');// '\123'为8进制转义字符,0123对应10进制数为83 printf("%d\n", '\x23');// '\x23'为16进制转义字符,0x23对应10进制数为35 return 0;

    2.6.4 数值溢出

    当超过一个数据类型能够存放最大的范围时,数值会溢出。

    有符号位最高位溢出的区别: 符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。

    由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。

    不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。

    #include <stdio.h>
    int main()
        //传统方式赋值
        float a = 3.14f; //或3.14F
        double b = 3.14;
        printf("a = %f\n", a);
        printf("b = %lf\n", b);
        //科学法赋值
        a = 3.2e3f; //3.2*1000 = 32000,e可以写E
        printf("a1 = %f\n", a);
        a = 100e-3f; //100*0.001 = 0.1
        printf("a2 = %f\n", a);
        a = 3.1415926f;
        printf("a3 = %f\n", a); //结果为3.141593
        return 0;
    

    2.8类型限定符

  • 字符串是内存中一段连续的char空间,以'\0'(数字0)结尾。
  • 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
  • 字符串常量与字符常量的不同:
    每个字符串的结尾,编译器会自动的添加一个结束标志位'\0',即 "a" 包含两个字符'a'和’\0’。

    2.9.2 printf函数和putchar函数

    printf是输出一个字符串,putchar输出一个char。

    printf格式字符:

    对应数据类型 putchar(c);//putchar只有一个参数,就是要输出的char long a2 = 100; printf("%ld, %lx, %lo\n", a2, a2, a2); long long a3 = 1000; printf("%lld, %llx, %llo\n", a3, a3, a3); int abc = 10; printf("abc = '%6d'\n", abc); printf("abc = '%-6d'\n", abc); printf("abc = '%06d'\n", abc); printf("abc = '%-06d'\n", abc); double d = 12.3; printf("d = \' %-10.3lf \'\n", d); return 0;

    2.9.3 scanf函数与getchar函数

    getchar是从标准输入设备读取一个charscanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
    #include <stdio.h>
    int main()
        char ch1;
        char ch2;
        char ch3;
        int a;
        int b;
        printf("请输入ch1的字符:");
        ch1 = getchar();
        printf("ch1 = %c\n", ch1);
        getchar(); //测试此处getchar()的作用
        printf("请输入ch2的字符:");
        ch2 = getchar();
        printf("\'ch2 = %ctest\'\n", ch2);
        getchar(); //测试此处getchar()的作用
        printf("请输入ch3的字符:");
        scanf("%c", &ch3);//这里第二个参数一定是变量的地址,而不是变量名
        printf("ch3 = %c\n", ch3);
        printf("请输入a的值:");
        scanf("%d", &a);
        printf("a = %d\n", a);
        printf("请输入b的值:");
        scanf("%d", &b);
        printf("b = %d\n", b);