美文网首页我爱编程
01进制转换和变量

01进制转换和变量

作者: 忘带充电宝de皮卡丘 | 来源:发表于2018-05-28 18:13 被阅读0次

    计算机内存存储数据的部位有硬盘和内存

    硬盘存储的是可见数据,内存存储的是不可见数据

    硬盘,内存所存储的数据都是二进制数据

    我们使用的计算机室为了实现数据存储,数据运算,数据管理

    [1]我们(程序员)必须了解数据是如何存储到计算机中的

    [2]我们(程序员)必须了解,我们如何通过代码将数据存储到计算机中,以及如何使用这些数据

    [对于人类]我们人类通常对于十进制数据更加熟悉

    [对于计算机]计算机通常用二进制来存储数据,因为二进制对于计算机而言比较容易实现

    内存存数数据的基本单元是三极管(导通,截止,反向击穿)

    计算机中表示数据的方式有 二进制,八进制,十进制,十六进制

    二进制:由0和1两种字符组成,前缀为0b,例子:0b1001

    八进制:由0~7八种字符组成,前缀为0,例子:0755

    [应用:文件权限]

    d rwxr-xr-x=d rwx r-x r-x

    = 111 101 101

    = 7 5 5

    =0755

    第一组:文件所有者得权限

    第二组:文件所有者所在小组的其他成员的权限

    第三组:文件所有者的小组之外其他小组的权限

    十进制:由0~9十种字符组成

    十六进制:由09和AF十六种字符组成,前缀为0x,例子:0x1a,0x799

    [应用:颜色表示]

    颜色的三原色:红 绿 蓝

    #FF0000 —红色

    #00FF00 —绿色

    #000000 —黑色

    #FFFFFF —白色

    [注]八进制,十六进制的诞生时为了解决两个问题:

    (1)二进制数据本身不是很直观(无法很容易地看懂)

    (2)十进制数据转成二进制数据,转换过程必须使用除2法,比较麻烦

    1.二进制 转 十进制

    0b10010=0 * 2^0 + 1 * 2^1 + 0 * 2^2 + 0 * 2^3 + 1 * 2^4

    =1 * 2^1 + 1 * 2^4

    =18

    [注]二进制数据 从右往左数,依次是 第0,1,2......位

    转换方法:二进制数据的每一位数值,乘以2的位数次方,然后全部相加得到十进制结果

    2.十进制 转 二进制

    18=0b10010

    转换方法:除2法,余数从下往上数

    3.二进制 转 八进制

    0b10010=010 010

    = 2 2

    =022

    转换方法:二进制转八进制,从右往左,每三位一取作为一组,高位不够补0

    4.二进制 转 十六进制

    0b10010=0001 0010 0b111101=0011 1101

    = 1 2 = 3 d

    =0x12 =0x3d

    转换方法:二进制转十六进制,从右往左,每四位一取作为一组,高位不够补0

    二进制数据的三种形态:原码,反码,补码

    任何一个数据存储到计算机中,必须分配有固定大小的内存单元

    而在计算机中,最小的数据单元为字节

    1字节 == 8个二进制位

    1.原码

    一个二进制数据的原码是由符号位和数值位构成,符号位占一位,其他位就是数值位。符号位在最高位

    正数的符号位为0,负数的符号位为1

    在确定字节数的情况下,最高位作为符号位,其他位用来表示数值的绝对值大小

    例:1字节3的原码 0000 0011

    1字节-3的原码 1000 0011

    [结论] 二进制的原码无法正确运算,计算机不会采用原码来计算数据

    2.反码

    在确定字节数的情况下,正数的反码和原码一样;

    ​ 负数的反码,符号位不变,其他位取反(1变0,0变1)

    例:0000 0011 1字节3的反码

    1111 1100 1字节-3的反码

    [结论] 二进制的反码无法正确运算,计算机不会采用反码来计算数据

    3.补码

    正数的补码和原码、反码一样,负数的补码是 反码加1

    例:0000 0011 1字节的3的补码

    1111 1101 1字节的-3的补码

    [注]对补码再求一次补码得到原码

    计算机中是以二进制的形式存储、计算数据的

    [结论]计算机是以二进制的补码形式存储、计算数据的,因为补码可以正确运算

    4.总结

    八进制数据前缀为0

    十六进制数据前缀为0x

    二进制数据前缀为0b

    打印二进制数据,没有特定的打印格式!!!

    打印八进制数据,用%o

    打印十进制数据,用%d

    打印十六进制数据,用%x

    程序中存在多种数据,但是数据总体上讲可以分为两种:常量数据 和 变量数据

    C语言中的基本数据类型有三类:整型,字符型,浮点型(实型)

    整型:关键字为 int,short,long

    [注] 使用整型的关键字可以定义整型变量,用来存储整数

    字符型:关键字为 char

    [注] 使用字符型的关键字可以定义字符型变量,用来存储字符常量

    浮点型:关键字为 float,double

    [注] 使用浮点型的关键字可以定义浮点型变量,用来存储带小数点的数

    标识符的命名规则:

    <1>必须由数字,字母,下划线中的一种,或多种组成.

    <2>不能以数字开头.

    <3>不能和系统预定义的关键字重复

    正确表示的标识符可以用来给变量,函数,指针变量,结构体等等命名.

    [整型] int,short,long

    1.整型变量的定义

    int i;//在程序运行时,会向计算机申请4个字节内存单元,这个内存单元的名字就用i表示,使用i就   如果使用分配的4字节内存单元.
    short s;//会向计算机申请2个字节内存单元.
    long l;//会向计算机申请8个字节内存单元.
    //使用sizeof(xxx)  可以测得某个变量所占内存空间大小
    printf("%ld\n",sizeof(i));
    printf("%ld\n",sizeof(s));
    printf("%ld\n",sizeof(l))
    

    2.整型变量的初始化

    //初始化,指的是在变量定义的同时通过赋值号给变量赋一个初始值.
    // = , 赋值号
    int i5 = 100;
    

    3.整型变量的赋值

    //赋值,指的是在变量定义之后,给变量赋一个新值.
    //后赋的值 会覆盖掉之前存的值.
    i5 = 200; 
    

    4.整型变量的输入/输出

    类型 输入格式 输出格式
    int %d %d
    short %hd %hd
    long %ld %ld

    [注] 数据输入使用scanf语句

    数据输出使用printf语句

    //可以通过scanf语句给变量i赋值,赋的值是通过键盘输入的.

    scanf("%d",&i);//& 是取地址符,可以取得变量的地址(内存中的地址)

    整型变量的数据表示范围:

    在程序中使用int,short,long所定义的变量默认是有符号类型的变量

    有符号整型变量数据表示范围是根据变量所占内存大小而定的

    基本整型(int) -2^31 ~ 2^31-1 -21亿 ~ 21亿

    短整型(short) -2^15 ~ 2^15-1

    长整型(long) -2^63 ~ 2^63-1

    0111 1111 ~~ 1111 1111 == 2^31-1

    1000 0000 ~~ 0000 0000 == -2^31

    1111 1111 ~~ 1111 1111 == -1

    如果需要在程序中定义无符号整型变量,需要在int等关键字前加unsigned

    unsigned int i;

    无符号 基本整型(unsigned int) 0~2^32-1

    无符号 短整型(unsigned short) 0~2^16-1

    无符号 长整型(unsigned long) 0~2^64-1

    字符变量

    定义字符变量使用char

    定义无符号字符变量使用 unsigned char

    定义字符变量是用来存储字符数据的,例如‘a’‘9’‘+’

    1.定义一个字符变量

    //定义(有符号)字符变量使用 char
    char c;//刚定义出来的字符变量,如果不初始化,值无法确定
    //字符变量 占 1字节内存
    printf("%ld\n",sizeof(c));
    //有符号字符变量存储数据范围:-2^7 ~ 2^7-1
    //无符号字符变量存储数据范围:0 ~ 255
    

    2.字符变量的初始化

    char c1='a';
    char c2='+';
    

    3.字符数据的输入/输出

    输入:

    scanf(“%c”,&c);

    输出:

    printf(“%c\n”,c);

    浮点型变量

    定义浮点型变量可以使用的关键字有:float,double

    浮点型变量 用来存储带小数点的数

    1.浮点型变量的定义

    //float,double
    //float 定义的变量,称为“单精度浮点型”变量,可以存储小数点后6-8位
    //double 定义的变量,称为“双精度浮点型”变量,可以存储小数点后13-15位
    float f;//定义float类型变量,变量f会占用4字节内存空间
    double d;//定义double类型变量,变量d会占用8字节内存空间
    printf("%ld\n",sizeof(f));
    printf("%ld\n",sizeof(d)); 
    

    2.浮点型变量的初始化

    float f1=3.14f;
    double d1=6.28;
    //打印浮点型变量的值
    //输单精度浮点型数据,用%f
    //输出双精度浮点型数据,用%lf
    //%f,%lf,默认输出的数据都保留小数点后6位
    printf("%f\n",f1);
    printf("%lf\n",d1); 
    

    3.浮点型变量的赋值

    //后赋的值,会覆盖之前的值
    f1=6.28f;
    printf("%f\n",f1);
    //我们可以通过 %m.nf 控制输出格式
    //m ,数据所占总字符宽度
    //n,小数点后保留n位
    f1=3.14f;
    printf("%.2f\n",f1);
    

    内存大小

    类型 内存大小(32) 内存大小(64)
    int 4 4
    short 2 2
    long 4 8
    char 1 1
    float 4 4
    double 8 8

    数据输入/输出格式

    类型 输入/输出格式
    int %d
    short %hd
    long %ld
    char %c
    float %f
    double %lf
    unsigned int %u
    unsigned short %hu
    unsigned long %lu

    不同进制数据—输入/输出格式

    进制 格式
    八进制 %o
    十进制 %d
    十六进制 %x

    ​ [注] %i,可以用来输出各种进制的数据

    输入scanf的工作原理

    程序开始执行后,会在scanf语句处停下来,等待用户输入数据,一旦用户输入了数据,不管输入了多少数据、什么类型的数据,通通会在用户按下回车键时被写入到[输入缓冲区],然后scanf才从[输入缓冲区]中去取对应格式的数据

    如果当scanf语句从[输入缓冲区]中取数据时,如果有scanf语句想要的特定格式的数据,直接读走数据,就不会等待用户输入

    只有在[输入缓冲区]中没有数据,没有特定格式的数据,才会等待用户输入

    [结论] scanf读取数据时,是首先从[输入缓冲区]中取数据的

    清除[输入缓冲区]中的所有字符:

    scanf("%*[^\n]");
    scanf("%*c"); 
    

    输出printf的工作原理

    当程序执行到printf语句时,会把需要输出的字符串挨个写入到[输出缓冲区],当遇到[输出缓冲区]刷新条件时,才会把[输出缓冲区]中的数据显示到终端输出

    缓冲区刷新的条件

    <1> \n

    <2> 程序结束

    <3> 手动刷新 fflush(stdout)

    <4> 当缓冲区满 4096字节(4K)

    1字节==8二进制位

    1024字节==1KB

    1024KB==1MB

    1024MB==1GB

    1024GB==1TB

    相关文章

      网友评论

        本文标题:01进制转换和变量

        本文链接:https://www.haomeiwen.com/subject/jczgjftx.html