整型数据
1.整型常量表示方法
八进制(0开头),十六进制(0X,0x开头),十进制
在程序中根据前缀区分各种进制
2.整型变量
内存二进制存储 一字节byte=8位bit
a.数值是以补码表示的
正数的补码和原码相同
负数的补码:将该数的绝对值的二进制形式按位数取反再加1
例如:-10补码
10的源码:00001010
取反: 11110101
+1: 11110110
b.整型变量的分类
1.基本型:类型说明符int
2.短整型:short int或short
3.长整型:long int或long
4无符号型:unsigned
占多少字节与系统和编译器规定有关
以下代码可查看对应字节
#include<stdio.h>
main()
{
printf("%d",sizeof(int));
}
c.整型变量的定义
同类型说明符,变量名之间用“,”隔开,结尾用“;”
d.整型数据的溢出
由于字节大小,例如short int为2字节,有16位可存储位置为2的16次方为6536,又有正负,所以正数为6536÷2-1=32767(减去0这一个数),所以当让32767+1,则结果按补码形式为-32768,具体如下看
#include<stdio.h>
void main()
{
short int a,b;
a=32767;
b=a+1;
printf("%d,%d\n",a,b);
}
实型数据
1.实型常量的表示方法
实型也叫浮点型,实型常量也称实数或浮点数。在c语言中,实数只采用十进制,它有2种形式,十进制小数形式,指数形式
a.十进制形式:由数码0-9和小数点组成
b.指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能整数,可以带符号)组成
例:2.1E5(表示2.1*10的5次方)
2.实型变量的分类
单精度(float型),双精度(double型);长双精度(long double型)
3.在内存的存放形式
实数一般占4个字节(32位)内存空间。按指数形式存储。实数3.14159在内存中的存放形式如下:
小数部分跟平时理解小数部分,不太一样,不是指0.14159部分,而是把3.14159看成0.314159*10,故小数部分为“.314159”指数为1
4.实数的舍入误差
由于实数是由有限的存储单元组成的,因此能提供的有效数字总是有限的。
字符型数据
字符型数据就是字符。
1.字符型数据的表示
字符型数据是用单引号括起来的一个字符。例如:
‘a’、‘b’、’=’、’+’、’?’
都是合法字符型数据。
在C语言中,字符型数据有以下特点:
- 字符型数据只能用单引号括起来,不能用双引号或其它括号。
- 字符型数据只能是单个字符,不能是字符串。
- 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如’5’和5 是不同的。'5’是字符型数据,不能参与运算。
2.转义字符
转义字符是一种特殊的字符。转义字符以反斜线""开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各示例中printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。
转义字符 | 转义字符的意义 | ASCII代码 |
---|---|---|
\n | 回车换行 | 10 |
\t | 横向跳到下一制表位置 | 9 |
\b | 退格 | 8 |
\r | 回车 | 13 |
\f | 走纸换页 | 12 |
\ | 反斜线符"" | 92 |
’ | 单引号符 | 39 |
\” | 双引号符 | 34 |
\a | 鸣铃 | 7 |
\ddd | 1~3位八进制数所代表的字符 | |
\xhh | 1~2位十六进制数所代表的字符 |
广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表中的\ddd和\xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示字母"A" ,\102表示字母"B",\134表示反斜线,\XOA表示换行等。
3.字符变量
字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。例如:
char a,b;
a.字符变量在内存中的存储形式及使用方法
每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。
如x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a、b赋予’x’和’y’值:
a=‘x’;
b=‘y’;
实际上是在a、b两个单元内存放120和121的二进制代码
整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。
4.字符串
字符串是由一对双引号括起的字符序列。例如: “CHINA” , “C program” , “$12.5” 等都是合法的字符串。字符串和字符不同,它们之间主要有以下区别:
a.字符由单引号括起来,字符串由双引号括起来。
b.字符只能是单个字符,字符串则可以含一个或多个字符。
c.可以把一个字符型数据赋予一个字符变量,但不能把一个字符串赋予一个字符变量。在C语言中没有相应的字符串变量,也就是说不存在这样的关键字,将一个变量声明为字符串。但是可以用一个字符数组来存放一个字符串
d.字符占一个字节的内存空间。字符串占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0" (ASCII码为0)。这是字符串结束的标志。
各类数值型数据间的混合运算
1.转换方法:自动转换和强制转换
2.自动转换规则
a.运算量不同则转换为同类型
b.按数据长度增加方向转换
c.所有浮点运算都以双精度进行
d.char型和short型参与运算,必须先转换为int
e.赋值运算中如果赋值号“=”两边的数据类型不同,赋值号右边的类型转换为左边的类型,当右边量数据类型长度比左边长时,将丢失部分数据,按四舍五入先前舍入,降低精度
#include<stdio.h>
#include <stdlib.h>
main()
{
float p=3.14159;
int s,r=5;
s=r*r*p;
printf("s=%d\n",s);
system("pause");
}
此处p为实型,s,r为整型,在执行s=r*r*p时,r和p都转换为double型,结果也为double型,但由于s为整型,所以赋值结果仍为整型,舍去小数部分,故结果为78
3.自动转换
a.形式(类型说明符)(表达式)
b.注意:(int)(x+y)与(int)x+y不同,前者先计算x+y再转,后者转x再与y相加,与数学计算法则类似
4.无论哪种转换都是临时性转换,不改变数据说明时定义的类型
ps:类型转换舍小数,赋值运算四舍五入
例
#include<stdio.h>
#include <stdlib.h>
main()
{
float p=3.9;
printf("int p %d\n",(int)p);
system("pause");
}
这里为强行转换,故结果为3
基本的算术运算符
1.加法运算符“+”:双目运算,右结合性
2.减法运算符“-”:双目运算,左结合性
3.乘法运算符“-”:双目运算,左结合性
4.除法运算符“-”:双目运算,左结合性,当参与量均为整型则结果为整型,舍去小数;当有一个为实型则结果为双精度实型
算术优先级与结合性
优先级:分15级,1级最高,15级最低,优先级高先运算
结合性:关于结合性,可理解为哪边优先运算
例如“=”为右结合性,则
#include<stdio.h>
#include <stdlib.h>
main()
{
int a,b,c;
b=2;
c=1;
a==c;
printf("%d",a);
system("pause");
}
改代码中a=b=c,是a先等于b还是先b=c呢,因为=为右结合性所以从右开始,c赋值给b,b再给a
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () [] -> | 左 |
2 | ! ~ ++ – = - * & sizeof | 右 |
3 | * / % | 左 |
4 | + - | 左 |
5 | << >> | 左 |
6 | < <= > >= | 左 |
7 | == != | 左 |
8 | & | 左 |
9 | …… | 左 |
10 | | | 左 |
11 | && | 左 |
12 | || | 左 |
13 | ? : | 左 |
14 | = += -= *= /= %= &= ^= |= <<= >>= | 右 |
15 | , | 左 |
ps:++i i自加1后在参与其他运算
i++ 则为i参与运算后再自增1
(–i和i–同)
ps:赋值中若有逗号,无括号则取最近
#include<stdio.h>
#include <stdlib.h>
main()
{
int a=2,b=4,c=6,d=8,y;
y=a,b,c,d;
printf("y=%d",y);
system("pause");
}
此时y=a
若有括号则最远
#include<stdio.h>
#include <stdlib.h>
main()
{
int a=2,b=4,c=6,d=8,y;
y=(a,b,c,d);
printf("y=%d",y);
system("pause");
}
此时y=d