C语言笔记变量与数据类型

 

目录

1.转义字符

2.常量与变量

2.1 什么是常量和变量

2.2 内存

2.3 变量的内存机制

2.4 变量命名规则

2.5 变量的定义

2.6 常量的定义

2.7 计算机内存字节顺序

2.8 局部与全局变量的区别

 

3.数据类型

3.1 数据表示

3.1.1进制之间转换

3.1.2计算机存储数据

3.1.3数据类型

3.1.4数据类型与内存

3.1.5正负符号的表示

3.1.6数值表示方法----原码、反码、补码

3.1.7数据类型有符号和无符号

3.1.8数据类型的取值范围

3.2 基本数据类型

3.2.1整型

3.2.2实型

3.2.3字符型

3.3 数据类型转换

3.3.1 隐式转换

3.3.2 强制数据转换

3.3.3 强制类型数据转换的影响

3.3.4 数据转换的二进制原理

 

1.转义字符 

具体转义字符,例如斜杠、单引号、双引号转义、换行

2.常量与变量

2.1 什么是常量和变量

计算机的数据在参与程序执行过程中,有些数据需要经常变化,有些数据不需要变化。所以把数据就分为常量和变量。

常量:程序执行过程中不需要变化的。

变量:程序执行过程中需要经常变化的。

2.2 内存

内存是用于存放数据的,内存=内存地址+内存空间(内存单元)。

 

2.3 变量的内存机制

    当程序执行,计算机就会为每个变量分配一个内存空间以供使用,通过变量名就可以实现对数据的读取、写入。

流程图:

变量名->数据类型->变量地址--->内存地址->内存空间

细节:

1,变量之所以变化,就是变量储存值得变化。

2,同一时间内,变量空间值只能保留一份值,新值冲掉旧值。

分析

a=1;

b=2;

a+b=3;

 

2.4 变量命名规则

标识符:用于标识常量、变量、函数的字符序列

规则:

1,_和字母开头,由字母和数字、_组成

2,严格区分大小写,

3,不能用关键字

2.5 变量的定义

1,定义变量的两种书写形式;

2,使用变量之前必须定义;

2,变量一定要初始化;

---前一个应用程序结束,操作系统并没有把内存空间数据清除,当新的应用程序开始执行,操作系统把会把闲置下来的内存重新分配给程序使用,如果没有对变量进行初始化,就有可能使用到上个程序的垃圾数据。

当然有些操作系统,会进行些默认的处理。

细节:

1,Vs2013

 引用未初始化的变量,要报错

  只定义未初始化,未引用不报错。可以编译通过。

引用:使内存地址与变量名关联起来?

2.6 常量的定义

1,定义常量的两种形式

 Define ;const锁定变量

2,常量的特点

1,在程序执行过程中一旦定义,就不能修改其值;

2,常量的好处:可以修改定义处的值,达到修改全部引用该常量的值

2.7 计算机内存字节顺序

数据在内存空间里按照什么顺序存放。

2.8 局部与全局变量的区别

 函数内称为局部变量,外面就是全局变量

局部变量:  没有生明和定义的差别;

全局变量:有声明和定义的差别,定义只能一个,声明可以多个

3.数据类型

3.1 数据表示

 

正确表示一个十进制的数65

    int a,b,c;
    a=65;    //65十进制形式
    b=0101;//65八进制形式
    c=0x41;//65十六进制形式
错误表示一个十进制的数65
    a=65;     //十进制是65
    b=065;  //十进制是53
    c=0x65; //十进制是101

 

 

 

3.1.1进制之间转换

二进制、八进制、十六进制转十进制------按权相加;

二进制转八进制,八进制转二进制------三位;

二进制转十六进制,十六进制转二进制-----四位;

十进制转二进制------整除;

十进制小数转换为二进制------2取整

3.1.2计算机存储数据

数据是以二进制位序列的方式存放于内存中。

二进制序列->加上结构的概念->称为字节。8个位为一个字节。

内存起始编号为1,每隔8位编号增1,对内存进行编号管理。

3.1.3数据类型

数据类型主要是对计算机出现的数据进行一个分类

数据类型种类:

1)基本数据类型:数值(整型、实型)和字符型

2)构造类型:数组、结构体、共用体

3)指针类型:

4)空类型:

3.1.4数据类型与内存

不同的数据类型占据不同的空间,整数从数学上就是从负无穷到正无穷之间的任意数,但是内存是有限的。

3.1.5符号的表示

整数的正负----用最高位表示符号,0表示正,1表示为负。

3.1.6数值表方法---原码、反码、补码

怎么求一个数值的原码、反码、补码

 

在计算机中,数值一律用补码来表示(存储)

原因

1,使用补码,可以将符号位和其它位统一处理,减法也可按加法来处理,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

2,使用原码,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。 

图。。。。。。。。。。待补充

3.1.7 数据类型的符号

数据类型分为:有符号和无符号

3.1.8 数据类型的取值范围

      一个数据类型能表示的最小值 、最大值。

3.2 基本数据类型

    3.2.1整型

1)整型常量三种表示形式:十进制、八进制、十六进制

细节:整型常量的取值范围受到打印控制符决定的。

2)整型变量根据取值范围分为:short intlong(默认有符号,可以指定为无符号)

 

细节:超出数据类型的表示范围,就会数据溢出。越过一定范围就会出错!

3)整型变量的内存分析

 

4)可以夸平台移植的整数

 Int 16位为2个字节, 324个字节

Long 64Linux8个字节,Windows 32/64位都是4个字节

3.2.2实型

小数点位置固定不变的称为定点数,小数点位置可以浮动的称为浮点数。在计算机中,用定点数表示整数和纯小数,即有整数部分、又有小数部分的用浮点数表示。

科学计数法:1.234E2 其中1.234为尾数,10为基数,2为指数。

浮点数利用指数达到浮动小数点的效果,灵活的表达更大的实数。

1)两种表示形式:十进制,指数

2)浮点型数据分为:单精度(4个字节,6-7位有效数字)和双精度(8个字节,15-16位有效数字)。例如,1.0(8个字节),1.0f4个字节)

3)为什么用浮点数表示实数?

1.01

1.0001

1.00000001

   不能用整数一一对应方式,浮点数利用指数达到浮动小数点的效果,灵活的表达更大的实数;打印intfloat 极值可以,得出都占4个字节,float能表达更大的值。

3)浮点数的误差

  

5)三种类型:float  doublelong double

输入、输出float,用%f;

输入、输出double,用%lf

输入、输出long double,用%Lf;

6) 浮点内存原理

 

3.2.3字符型数据

1,字符常量:单引号括起来的单个字符或转义字符。

 字符常量的值:该字符的ASCII码值

1)putchar(),分别使用单引号、十进制、八进制、十六进制输出字符

2)putchar()输出转义字符

 

//0x41(十六进制)=='\x41'(字符)==65(十进制)==A(字符);

方式一
char ch0,ch1, ch2, ch3;
    ch0 = 'A';
    ch1 = 65;
    ch2 = '\x41';
    ch3 = 0x41;
    printf("%c,%c,%c,%c",ch0,ch1,ch2,ch3);
方式二
    putchar('\n');
    putchar('A');
    putchar(65);
    putchar('\x41');
    putchar(0x41);

 

 

 

2,字符串常量:用双引号括起来的字符序列。

1),每个字符串尾自动加个‘\0’作为字符串结束标志。

2)字符串不能赋值个字符变量

3)printf输出字符串

3,字符常量与字符串常量的区别?

3字符型数据---char 

 字符变量在内存中占一个字节,存储的事字符的ASCII值。

取值范围:

 char :-127~+127

unsigned char :0~255;

char ch=128 //取值范围-127+127

0111 1111//最大值+127

+1       //数据溢出

1000 0000//进位后内存中二进制形式,

%d 带符号十进制整数,所以是4个字节 ,以符号进行填充。
填充后如下:
1111 1111 1111 1111 1111 1111 1000 0000 二进制--补码形式
1111 1111 1111 1111 1111 1111 0111 1111     反码
1000 0000 0000 0000 0000 0000 1000 0000     原码
-128                                           十进制
%x 无符号十六进制整数,所以是4个字节,以符号进行填充。
填充后如下:
1111 1111 1111 1111 1111 1111 1000 0000  原码-二进制
f     f    f     f    f    f    8   0   无符号十六进制


printf("%d,%x",ch,ch)//-128,ffffff80

 

1与‘1’的区别?

ASCII特殊字符

 

宽字符问题

英文字符---1个字节,汉字---2个字节。当用一个汉字去表示字符,就会出现宽字符问题,处理宽字符就把汉字当作一个字符。

 

 

3.3 数据类型转换

3.3.1 隐式转换

1,表达式计算

1)小的数据类型转向大的数据类型

2)有符号转向无符号

3char\short直接转成int类型

2,赋值号类型换

3.3.2 强制数据转换

强制转换得到只是个中间变量,不会改变原数据的值。

 结论:强制转换可以将类型转成掐好解析的类型,就可以的到正确的结果。

 

3.3.3 强制类型数据转换的影响

1,精度损失

2,数据溢出

3.3.4 数据转换的二进制原理

 

 

 

 

char ch=128 //取值范围-127+127

0111 1111//最大值+127

+1       //数据溢出

1000 0000//进位后内存中二进制形式,

%d 带符号十进制整数,所以是4个字节 ,以符号进行填充。
填充后如下:
1111 1111 1111 1111 1111 1111 1000 0000 二进制--补码形式
1111 1111 1111 1111 1111 1111 0111 1111     反码
1000 0000 0000 0000 0000 0000 1000 0000     原码
-128                                           十进制
%x 无符号十六进制整数,所以是4个字节,以符号进行填充。
填充后如下:
1111 1111 1111 1111 1111 1111 1000 0000  原码-二进制
f     f    f     f    f    f    8   0   无符号十六进制


printf("%d,%x",ch,ch)//-128,ffffff80

 

 

 

 

 

 

 

 

 

 

posted on 2018-01-04 19:10  潜龙传  阅读(535)  评论(0编辑  收藏  举报

导航