c复习day02

数据类型

作用:告诉编译器我这个数据在内存中需要多少的空间

常量:程序运行中不能改变的量

  • 整形常量:1,34

  • 字符常量:’a’

  • 字符串常量:’hello’

  • 浮点型常量:123.32

  • 变量

    • 程序在运行中可以被改变的量,存在于内存中
    • 变量需要定义:在内存中开辟空间(声名)
    • 变量的定义形式:数据类型 变量名
类型 占用字节
int 4字节
short 2字节
long 在win中4字节,Linux 32位4字节,64位8字节
char 1字节
float 4字节
double 8字节
  • int a; 在内存中定义一个变量a,占用4字节
1
int a;
  1. 定义:在内存中开辟空间
  2. 初始化:定义时赋值
  3. extern 告诉编译器有这个东西,但是这里不开辟空间
  4. 变量取名不能位关键字
  5. 定义宏事实上即使定义常量,不可以被修改

const

  • const修饰的变量不能通过变量名修改

进制

  • 十进制:逢十进一
  • 二进制:逢二进一
  • 八进制:逢八进一
  • 十六进制:逢十六进一
二进制
  1. c语言中不可以书写二进制
  2. 一个二进制0或者1代表一位,8位就是一个字节
  3. 1b = 1位;1B = 8位;1kb = 1024b
十进制转二进制
  • 除二反向去余法
二进制转十进制
  • 1 1 0 1

  • 2^01 + 2^1 * 0 + 2^2* 1 + 2^31 = 13

八进制
  • 书写:0123(在数字前加0)
十进制转八进制
  • 除八反向去余法
八进制转十进制
  • 与二进制相似
八进制转二进制
  • 因为八进制最大值就是7所以我们用三个二进制位就可以表示
  • 257 -> 010 101 111
  • 二进制表示八进制
  • 分别为三个一组

十六进制

  1. 十六进制0-9,a-f
  2. c语言中如何书写十六进制:0x1ab,0XAB
十进制转十六进制
  • 除十六反向取余法
十六进制十进制
  • 7 b
  • 7 * 16^1 + b *16^0
十六进制转二进制
  • 四个二进制可以表示一个十六进制
二进制转十六进制
  • 四个一组表示一个十六进制
十六进制转八进制
  • 先转二进制再转八进制

有符号数和无符号数

有符号就是可以表示正数和负数
char类型的值默认只有一字节,有八位,其中有一个位用来表示符号
  • 符号位1表示是负数,0表示是正数
  • 如果是int类型有1位是符号位,31位是数据位
  • 有符号:最高位位符号位,其他位为数据为
  • 无符号的全部是数据位置(unsigned)
  • 有符号数和无符号数表示的数的个数相同,只是范围不同
数值的范围
  • char
  • 有符号数和无符号数能够表示的数的个数相同,只是范围不同
    • 1 0000000 -1 1111111 -> -0 - -127
    • 0 0000000 -0 1111111 -> +0 - +127
    • 规定 -0 表示为-128
    • -128 - +127(-2^7 -> 2^7-1)
    • unsigned e
    • 00000000 11111111
    • 0 - 255
  • short
    • signed short(-2^15 -> 2^15-1)
    • unsigned short(0 - >2 ^16 -1)
  • int
    • signed int(-2^31 - 2^31-1)
    • unsigned int(0 -> 2^32 -1)

反码源码补码

源码
  • 数的最原始的二进制码
  • 120 -> 01111000
  • -23 -> 10010111
    • -0 :1000 0000
    • +0 :0000 0000
    • -1 :1000 0001
    • 1 :0000 0001
    • 1 + -1 ?
    • 0000 0001
    • 1000 0001
    • 1000 0010 = -2
    • 注意:负数如果在计算机中原码存,会导致两个问题负数运算结果不正确,0的状态有两种
反码
  • 正数的反码不变,负数的反码(符号位不变,其他位取反)
    • -0 : 1111 1111
    • +0: 0000 0000
    • -1: 1111 1110
    • 1 : 0000 0001
    • 1 + -1 = 1111 1111 = -0
    • 如果计算机用反吗去存,负数运算结果正确,但是0的状态还是有两种
补码
  • 正数的补码不变,负数的补码等于反码加1

  • -0: 0000 0000

  • +0 : 0000 0000

  • -1 : 1111 1111

  • 1 : 0000 0001

  • 1 + -1 = 0

  • 如果用补码去存,负数运算结果是正确的,0的转台只有一种

  • 赋值时:赋的是十进制,给的是源码,如果赋值是八进制或者十六进制,给的是补码

  • 打印时:十进制打印要的是源码,如果十六进制或者八进制打印要的是补码

    • 补码求源码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    int main(void)
    {
    //赋值时:赋的是十进制,给的是源码,如果赋值是八进制或者十六进制,给的是补码
    //打印时:十进制打印要的是源码,如果十六进制或者八进制打印要的是补码
    char num = 129;
    //源码=反码=补码:1000 0001
    //计算机认为是负数的补码
    //反码:1111 1110
    //原码:1111 1111
    printf("num = %d\n",num);
    return 0;

    }

源码:1001 0111(-23)

反码:1110 1000

补码:1110 1001

  • 补码求反码
  • 符号位不变,其他位取反

  • 1001 0110

    反码求源码

    • 反码加1
    • 1001 0110

进制的书写

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
int a = 134;
int b = 012;
int c = 0x23;
printf("%d\n", a);
printf("%#o\n", b);
printf("%#x\n", c);
return 0;
}
  • 数在计算机中的内容没有改变 只是输出的形式改变

  • 打印格式

  • %d 有符号整数

  • %u 无符号打印

整数的输入

scanf() :从键盘读取数据
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void)
{
int num = 0;
int sum = 0;

scanf("%d %d",&num,&sum);
printf("%d\n",num);
printf("%d\n",sum);
return 0;
}
  • 读取的格式 0-9遇到\n结束
  • 如果没有敲击\n,scanf会阻塞
sizeof()

用来测数据类型的大小

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
char a;
short b;
int c;
12long d;
long long e;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(short));
return 0;
}

整数打印格式、

  • %d 有符号打印int
  • %u 无符号打印int
  • %hd 有符号打印short
  • %hu 无符号打印short
  • %ld 有符号long
  • %lu 无符号long

字符型

  • 单个字符用单引号’’引起来
  • 字符’0’的ascii值位48
  • 字符’1’的ascii值是49
  • ‘A’ ascii值是65
  • ‘a’ asscii值是97
1
2
3
4
5
6
7
8
#include <stdio.h>
int main(void)
{
char ch = 65;
ch = ch + 32;
printf("%c\n",ch);
return 0;
}
读取多个字符问题
1
2
3
4
5
6
7
#include <stdio.h>
int main(void)
{
char ch;
scanf("%c",&ch);
printf("%c\n",ch);
}

%c只会读一个字符

转义字符
  • \n :换行
  • \a:警报
  • \t:水平制表
  • \v:垂直制表
  • \r:将光标移到本行开头

浮点型

  • 存小数的数据
  • float 4字节
  • double 8字节
  • 打印的时候,默认输出6位的小数点
  • 如果需要指定小数点后面的位数:%.7f即为输出指定位数
  • float能够保证的精度是6位有效数字
  • double保证的精度是15位

限定符

  • extern 声名:告诉编译器有这个东西,不开辟空间
  • const: 变量值,不可通过变量名字修改
  • Volatile :防止编译器优化
  • Register:建议将变量定义在寄存器

字符串常量

  • 双引号中间的东西就是字符串,单引号中间的是字符

  • 在字符串最后一个是\0的ascii值为数字0;

  • 数字零在内存中就是0

  • 字符0’0’ 内存中是45

  • \0在内存中是0

  • 打印字符串
    • 我们通常使用%s来打印字符串,遇到%0后就会停止
  • 打印的格式问题
  • %m.n格式:m制的是宽度.n指的是小数点后位数

  • 如果我们使用%-m.n表示左对齐

  • 如果我们使用%0m.n表示用0来补齐

  • 注意补零不能和左对齐同时使用

getchar和putchar

  • getchar 和 scanf的比较;
    • ch = getchar();
    • 如果我们要获取两个字符我们可以使用多个geichar来吃掉回车
八位转32位的方法浮
你的支持是我最大的动力!
0%