• 进制转换和变量


    进制转换和变量

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

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

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

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

      [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十种字符组成

    十六进制:由0~9和A~F十六种字符组成,前缀为0x,例子:0x1a,0x799 

        [应用:颜色表示]

    颜色的三原色:红 绿 蓝 

    #FF0000  —红色

    #00FF00  —绿色

    #000000  —黑色

    #FFFFFF  —白色

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

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

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

    一.[二进制 转 十进制]

    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的位数次方,然后全部相加得到十进制结果

    二.[十进制 转 二进制]

    18=0b10010

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

    三.[二进制 转 八进制]

    0b10010=010 010

      =  2     2

      =022

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

    四.[二进制 转 十六进制]

    0b10010=0001 0010             0b111101=0011 1101

      =    1        2                               =    3        d

      =0x12                               =0x3d 

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

     

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

     

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

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

    1字节 == 8个二进制位

    [原码]

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

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

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

    例:1字节3的原码 0000 0011

      1字节-3的原码 1000 0011

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

    [反码]

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

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

    例:0000 0011 1字节3的反码

      1111 1100 1字节-3的反码

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

    [补码]

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

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

      1111 1101 1字节的-3的补码 

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

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

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

    [总结]

    八进制数据前缀为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 ",sizeof(i));

    printf("%ld ",sizeof(s));

    printf("%ld ",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 ",sizeof(c));

        //有符号字符变量存储数据范围:-2^7 ~ 2^7-1

        //无符号字符变量存储数据范围:0 ~ 255

    <2>字符变量的初始化

    char c1='a';

        char c2='+';

    <3>字符数据的输入/输出 

    输入:

    scanf(“%c”,&c);

    输出:

    printf(“%c ”,c);

    [浮点型变量]

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

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

    <1>浮点型变量的定义

    //floatdouble

        //float 定义的变量,称为单精度浮点型变量,可以存储小数点后6-8

        //double 定义的变量,称为双精度浮点型变量,可以存储小数点后13-15

        float f;//定义float类型变量,变量f会占用4字节内存空间

        double d;//定义double类型变量,变量d会占用8字节内存空间

        printf("%ld ",sizeof(f));

        printf("%ld ",sizeof(d)); 

    <2>浮点型变量的初始化 

    float f1=3.14f;

        double d1=6.28;

        //打印浮点型变量的值

        //输单精度浮点型数据,用%f

        //输出双精度浮点型数据,用%lf

        //%f%lf,默认输出的数据都保留小数点后6

        printf("%f ",f1);

        printf("%lf ",d1); 

    <3>浮点型变量的赋值 

    //后赋的值,会覆盖之前的值

        f1=6.28f;

        printf("%f ",f1);

    //我们可以通过 %m.nf 控制输出格式

        //m ,数据所占总字符宽度

        //n,小数点后保留n

        f1=3.14f;

        printf("%.2f ",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("%*[^ ]");

      scanf("%*c"); 

    [输出printf的工作原理] 

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

    [缓冲区刷新的条件]

    <1>

    <2> 程序结束

    <3> 手动刷新 fflush(stdout)

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

    1字节==8二进制位

    1024字节==1KB

    1024KB==1MB

    1024MB==1GB

    1024GB==1TB

  • 相关阅读:
    .Net4.0并行库介绍——线程专有存储
    解决WPF中TextBox文件拖放问题
    POJ 2063 Investment(完全背包)
    HDU 1698 Just a Hook(线段树,成段更新)
    HDU 2665 Kth number(划分树入门题,纯套模板)
    HDU 4251 The Famous ICPC Team Again(划分树入门题)
    POJ 3295 Tautology(构造法)
    HDU 1540 Tunnel Warfare(线段树,去最大连续区间)
    HDU 1394 Minimum Inversion Number(求逆序数,线段树或者树状数组)
    POJ 2993 Emag eht htiw Em Pleh(水模拟)
  • 原文地址:https://www.cnblogs.com/firstsky/p/5374623.html
Copyright © 2020-2023  润新知