1.数据类型

使用数据的不同类型的目的:合理利用空间

计算机存储的是二进制,是一位二进制只能存放0或1,内存:1bit

1字节 == 8b(八位二进制),范围:0000 0000 ~1111 1111

4B等于4个字节

知识点一:常用关键字

------------------------------------在32位平台下---------------------------------------

关键字类型所占的空间
char字符串类型占1字节空间(8位二进制位)
short短整型占2字节空间(16位二进制位)
int整型占4个字节空间(32位二进制)
long长整型占4个字节空间(32位二进制)(在64为平台下占8个字节)
long long长长整型占8字节
float单精度浮点数占4个字节空间(32为二进制)(6-7位有效位,指数-37到38)
double双精度浮点数占8个字节空间(64为二进制)(15-16位有效位,指数-307到308)

字符型

#include<stdio.h>	//输出函数等需要的头文件
int main()
{
    char a = 'aaaaa';   //定义字符  //字符单引号,字符串双引号,字符串需要借助数组实现
    printf("%d\n",a);   //字符%d输出,按照ASCII码表输入对应字符整数
    printf("%c\n",a);   //字符%c输出,则输出字符,%s,输入字符串
    return 0;
}

整型

#include<stdio.h>
int main()
{
    int a = 123;	//定义整型
    short int b = 456;	//定义短整型
    long c = 789;		//定义长整型
    long long d = 1243543511111111;	//定义长长整型
    printf("%d,%hd,%lu,%lld",a,b,c,d);	//输出数据,123,456,789,1243543511111111
    return 0;
}

实型(浮点型)

赋值语句中若涉及到浮点数时注意两边类型尽量保持一致

浮点数赋值,若赋值右边没有加 f 默认是 double 类型(占8个字节)

指数形式:123e3

    意思:123*10的三次方

#include<stdio.h>
int main(int argc,char *argv[])
{
    //赋值语句的 = 两边的类型尽量保持一致
    float f = 3.14f;
    double d = 3.14;
    printf("sizeof(3.14) = %d\n",sizeof(3.14));		//8
    //不以f结尾的 实型常量 为double类型
    printf("sizeof(3.14) = %d\n",sizeof(3.14f));	//4
    //以f结尾的 实型常量 为float类型
    printf("f = %f\n",f);
    printf("d = %lf\n",d);
    scanf("%f",&f);
    scanf("%lf",&d);
    return 0;
}
#include<stdio.h>
int main()
{
    float a = 3.14;  //定义float类型
    double b = 4.311111123456789;   //定义double类型
    //在输出时%f可以输出float和double,但scanf输入时不能通用
    printf("%f,%f\n",a,b);  //3.140000,4.311111
    //如果输出位数较多,得限制位数才可以输出完整
    printf("%.6f,%.15lf",a,b);   //3.140000,4.311111123456789

    //如果越界,越界的数字是随机数
    return 0;
}

测试类型所占空间

sizeof:测试类型的长度(所占的空间)

#include<stdio.h>	//输出函数等需要的头文件
int main(int argc,char *argv[])
{
    printf("sizeof(int) = %d\n",sizeof(int));	//4
    printf("sizeof(float) = %d\n",sizeof(float));	//4
    printf("sizeof(doublt) = %d\n",sizeof(double));	//8
    printf("sizeof(long) = %d\n",sizeof(long));		//4
    printf("sizeof(short) = %d\n",sizeof(short));	//2
    printf("sizeof(char) = %d\n",sizeof(char));		//1
    return 0;
}

布尔型

#include<stdio.h>	//输出函数等需要的头文件
#include<stdbool.h>	//布尔类型头文件
int main()
{
    bool a = 1;	//定义布尔类型
    printf("%d\n",a);	//1
    return 0;
}

知识点二:unsigned 和 signed

1、无符号数:unsigned

    数据没有符号位,自身所有二进制位都是数据位

    例:unsigned char 0000 0000 ~ 1111 1111

2、有符号数:signed(默认省略)

    二进制最高位为符号位,其他位为数据位

    例:signed char xxxx xxxx(x:0或1)

    最位为 1 表示数,最位为 0 表示

    负数:1xxx xxxx 正数:0xxx xxxx

#include<stdio.h>
int main(int argc,char *argv[])
{
    //signed int num1 = 10;
    int num2 = 10;	//有符号(signed)默认省略
    unsigned num3 = 10;
    return 0;
}

知识点三:结构体 struct 和 共用体 union

1、struct:结构体中的成员拥有独立的空间

空间

struct data1
{
    char a;
    int b;
    shuot c;
};
a,b,c就是结构体dat1中的成员

2、union:共用体中的成员共享同一部分空间

空间

union data2
{
    char a;
    short b;
    int c;
}

知识点四:enum 和 void

1、enum:枚举

    将变量要赋值的值一一列举出来

enum BOOL{false,ture}//括号里面的是可以赋给变量的值,赋的值只能括号里面有的
enum BOOL bool = false;

2、void:无类型

    不能用void定义变量

知识点五:其他关键字

auto:自动类型

register:寄存器变量

static:静态变量

const:只读

sizeof:测类型大小

typedef:为已有的类型重新取别名

volatile:防止编译器优化

extern:外部的意思,一般用于函数和全局变量的声明

1、register:寄存器变量

寄存器内存图

总结:

    1)如果没有显示表明 register ,类似 int num,如果被高频使用系统也会放入寄存器中

    2)register int num; //显示表明将num放入寄存器

    3)寄存器的变量不能取地址

2、typedef:为已有的类型取别名

    为已有类型重新取个别名步骤:

    1)用已有的类型定义一个变量

    2)用 别名 替换 变量名

    3)在整个表达式的前方加上 typedef

#include<stdio.h>
typedef int INT32;	//取别名
int main(int argc,char *argv[])
{
    int num2 = 10;
    INT32 num1 = 34;
    printf("num1 = %d\n",num1);
    printf("num2 = %d\n",num2);
    return 0;
}
//num1 = 34
//num2 = 10

3、volatile:防止编译器优化

    作用:强制访问内存操作
volatile内存图

知识点六:常量与变量

1、常量

    值不能被修改(但不能反过来说:值不能被修改是常量)

    例:10、20、4.14、‘a’、“abcd”

2、变量

    系统根据变量的类型开辟对应的空间 其值可以被修改

    变量名 代表的是 空间的内容

    操作变量 就是对 空间内容的操作

    变量的命名规制:由数值、字符、下划线组成但是不能以数字开头

变量所占空间

知识点七:进制

进制类型及输出方法

输出时在 % 后加 # 表示输出进制的前缀

不同进制仅仅只是数据的表现形式不会修改数据本身

#include<stdio.h>
int main(int argc,char *argv[])
{
    int num = 100;
    //加个#号就是输出进制的前缀
    printf("十进制:num = %d\n",num);	//十进制输出  %d  %u  %ld  %lu
    printf("八进制:num = %#o\n",num);	//八进制输出  %o   以0开头
    printf("十六进制:num = %#x\n",num);	//十六进制输出  %x  以0x开头
    printf("十六进制:num = %#X\n",num);	//十六进制输出,但输出的十六进制字母为大写
    return 0;
}
//十进制:num = 100
//八进制:num = 0144
//十六进制:num = 0x64

进制转换

需要分组的只有八进制和十六进制,八进制3个数字为一组,十六进制4个数字为一组

对于整数, 有四种表示方式:

    二进制:0,1 ,满 2 进 1,以 0b 或 0B 开头

    十进制:0-9 ,满 10 进 1

    八进制:0-7 ,满 8 进 1,以数字 0 开头表示

    十六进制:0-9 及 A(10) - F(15),满 16 进 1,以 0x 或 0X 开头表示。此处的 A-F 不区分大小写

方法:8421法

二进制转八进制

三位为一组,一组按1,2,4分

0 0 1 1 0 1 0 0

​ 4 2 1 4 2 1

————————————

从左往右,三位一组,第一组三位中二进制为1的相加得八进制的个位,第二组三位中二进制为1的相加得八进制的十位,如果有第三组三位数则为1相加则为八进制的百位,以此类推

第一个三位二进制,1 0 0 则 421,为1的只有4,则八进制个位数为4

第二个三位二进制,1 1 0 则 421,为1的有4 和 2,则八进制十位数为4 + 2 = 6

则八进制为:(0)64

八进制转二进制

八进制拆开单独数字,一个数字对应三位 再按1,2,4分解

64 --》分为两组(三位一组),从左到右,第一组为4,第二组为6,6又分为4 + 2,有对应数字的二进制为1,没有为0

4 2 1 4 2 1

1 1 0 1 0 0

位数不足补零 0011 0100

二进制转十进制

直接按1、2、4、8…分,二进制为1的数字相加

0 0 0 1 0 1 0 1

    16 8 4 2 1

————————————

16+4+1 = 21

十进制转二进制

十进制拆分,1,2,4,8…组合的数,无需分组

21 = 16 + 4 + 1

16 8 4 2 1

——————

1 0 1 0 1 位数不足补零,0001 0101

二进制转十六进制

四位为一组,一组按1,2,4,8分

0 0 1 1 0 1 0 0

8 4 2 1 8 4 2 1

————————

从左往右,四位一组,第一组四位中二进制为1的相加得十六进制的个位,第二组四位中二进制为1的相加得十六进制的十位,第三组四位中二进制为1的相加得十六进制的百位,以此类推

第一个四位二进制,0 1 0 0 则 8421,为1的只有4,则八进制个位数为4

第二个四位二进制,0 0 1 1 则 8421,为1的有1 和 2,则八进制十位数为1 + 2 = 3

则十六进制为:0x34

十六进制转二进制

十六进制数分开单个数字,一个数字对应四位,并拆分 1,2,4,8…数组成

0x2A =》分为两组(四位一组),从左到右,第一组为A,A又分为8 + 2,第二组为2,有对应数字的二进制为1,没有为0

8 4 2 1 8 4 2 1

————————————————

0 0 1 0 1 0 1 0

八进制转十进制

八转二,二转十

十进制转八进制

十转二,二转八

八进制转十六进制

八转二,二转十六

十六进制转八进制

十六转二,二转八

十进制转十六进制

十转二,二转十六

十六进制转十进制

十六转二,二转十

知识点八:(整型变量的操作)取值(读)、赋值(写)

例:另一个中

知识点九:数据输出

符号含义
%d十进制有符号整数输出
%ld十进制long有符号整数输出
%u十进制无符号整数输出
%lu有符号long数据输出
%hd有符号short数据输出
%o以八进制表示的整数输出
%x以十六进制表示的整数输出
%ffloat型浮点数输出
%lfdouble型浮点数输出
%e指数形式的浮点数输出
%c单个字符输出
%s字符串输出
%p指针的值输出

特殊应用

    %3d          %03d          %-3d          %5.2f

    %3d:要求宽度为3位,如果不足3位,前面空格补齐,如果足够3位,此语句无效

    %03d:要求宽度为3位,如果不足3位,前面0补齐,如果足够3位,此语句无效

    %-3d:要求宽度为3位,如果不足3位,空格补齐,如果足够3位,此语句无效

    %5.2f:总宽度为5,.2表示:小数位保留2位

    但不能写 %-03d

知识点十:字符常量与变量

1、字符常量 char

’ ’ 包裹字符

%c 输出输出字符,用 %d 输出字符的ascii值

本质:在内存保存的是字符对应的ASCII码值

使用 scanf 键盘输入字符用 %c 只能提取一个字符

字符与对应的ASCII值完全等价

#include<stdio.h>
int main(int argc,char *argv[])
{
    //%c输出字符
    char ch = 'a';
    printf("ch = %d\n",ch);	//ch = 97
    //%d 输出字符的ASCII值
    printf("ch = %c\n",ch);	//ch = a
    //'a' == 97时完全等价的
    int a = 0;
    a= 98;
    printf("a = %c\n",a);
    //%d输出对应字符的ASCII值
    printf("a = %d\n",a);	//a = b
    a = a+1;
    printf("a = %c\n",a);	//a = c
    printf("a = %d\n",a);	//a = 99
    return 0;
}

知识点十一:转义字符

字符形式功能字符形式功能
\n回车换行\\一个反斜杠字符(\)
\t将当前位置移到下一个tab位置\’一个单引号(')
\v当前位置移到下一个垂直制表对齐点\"一个双引号(")
\r回车符\ddd三位八进制数代表一个ASCII字符
\f换页符\xhh二位十六进制代表一个ASCII字符
\b将当前位置后退一个字符\0空值,其ASCII码值为0

知识点十二:字符串

" " 包裹字符

默认结尾自动添加 \0 结尾(占一个字节)

只要遇到 \0结束

描述:'a’和"a"的区别

符与字符串所占字节

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星仔_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值