进制转换和变量

进制转换和变量

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

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

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

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

  [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

原文地址:https://www.cnblogs.com/firstsky/p/5374623.html