数据类型
C语言的变量: 1.使用前必须定义 2.确定类型
C语言的两个发展方向
1.C++/JAVA 对类型的检查更为严格(C允许自动转化)
2.JavaScript / PHP 不看重类型,甚至不需要事先定义
- 有利于更早的发现程序中的简单错误
- 迫使程序员更多的面对底层,实现而非事物逻辑
早期语言强调类型,面向底层的语言强调类型
C语言需要类型,但对类型检查不够
- 整数:char short int long ,long long
- 浮点数:float double long double
- 逻辑:bool
- 指针
- 自定义类型
char >1字节 long double >16字节
short >2字节 int > 4字节 double > 8字节
整形是二进制数(补码),浮点数是编码(不能直接运算)
sizeof(int);
sizeof(i);
sizeof()函数可以计算出占多少个字节
sizeof是静态的,编译后就产生结果,并不会产生可执行代码去做计算
CPU-----总线-----内存(RAM)
CPU中有寄存器(Reg),寄存器可以表达多少的数据,即为字长(每一次寄存器处理的数据)
int的大小即为寄存器的大小,即字长
表达负数的方法(补码)
一个字节可以表达的最大的数:
00000000>>11111111(0-255)
- 若希望-1+1=0,该如何做到
- 0---->00000000 1---->00000001
- 11111111+00000001=1 00000000
- -1=(1)00000000-00000001----->11111111
- 11111111被当作二进制看待时是255,被当作补码看待时是-1
- 同理对于-a,其补码就是0-a即2‘n-a,,n是这种类型的位数
补码的意义就是拿补码和原码相加可以得到一个带溢出的0
数的范围
- 对于一个字节(8位),可以表达的是00000000 - 11111111
- 其中00000000->0
- 00000001~01111111–>1 --127
- 11111111~10000000–>-1—128
unsigned的目的是为了做纯二进制的运算,为了移位
整数的输入输出
- %d:int
- %u:unsigned
- %ld:long long
- %lu:unsigned long long
字面量前有0是八进制 %o
字面量前有0x是十六进制 %x
只是如何把数字表达为字符串,与计算机内部如何表达数字无关
浮点类型
float 32bit=4字节
double 64bit=8字节
float-------------scanf %f------------------printf %f,%e(科学记数法) 5.67E+6
double---------scanf %lf-----------------printf %f,%e
%.16f 指定输出小数点后多少位
数字在计算机中的表达是离散的,所以使用double可能无法精确的表达一个数,而是最接近的
超过范围的浮点数
- printf 输出inf 表示输入的数超过范围(除以0,使用浮点数表达)
- printf 输出nan表示不存在的浮点数
float的字面量需要用f来表明身份
判断两个浮点数是否相等的方法
- 直接使用==可能失败
- 应当使用fabs(f1-f2)<1e-12 (小于可表达的精度即可)
浮点数在计算机内部使用编码的形式表达
** bool类型**
以前c是没有bool类型的,使用0 1
- #include<stdbool.h>
- 之后就可以使用true和false
bool b=6>5;
bool t=true;
printf("%d\n",b); //输出1
逻辑运算
4<x<6不是C能正确计算的式子,因为4<x得到的是一个逻辑值------>x>4&&x<6
- 判断一个字母是否是大写字母 x>=‘A’&&x<=‘Z’
- !a<20 --单目运算符!会先做,即a为0会先变成1,a不为0会先变成0
- !(a<20)
优先级
赋值运算是从左向右进行的
- 对于&&,如果左边是false,就不做右边了
- 对于||,如果左边为true,就不做右边了
不要把赋值写进表达式
自动类型转换
-
当运算符的两边出现不一样的类型时,会自动转换为较大的类型
-
char—short—int—long—long long
-
int-float—double
-
printf会把任何小于int的当作int输出,浮点数当作double
-
scanf不可以需要%hd,%d,%ld,%f,%lf
强制类型转化
(int)10.2;
(int)i;
- 强制类型转换并不会改变变量的值
- 强制类型转换的优先级高于四则运算 int i=(int)(a/b)
条件运算符
count=(count>20)?count-10:count+10;
条件运算符的优先级仅高于赋值运算符
逗号运算符
- 以右边的值,作为式子的结果(优先级比赋值还低)