C语言:数据类型、存储区字节数、占位符、sizeof、输入输出、二进制相关、操作符(++,--)、主函数参数
数据类型:
字符类型-------char:256个数字[-128,127]
每个数字表示一个字符. 97--------'a'
65--------'A'
unsigned char: 无符号字符类型[0,255]
short: 短整数类型,包含65536个不同的数
unsiged short: 无符号短整数类型[0,65535]
long:长整数类型,里面包含2的32次方个不同的整数,一半非负数,一半负数
unsigned short: 无符号长整数类型
int: 整数类型
unsigned int:无符号整数类型
float:单精度浮点型
double:双精度浮点类型
字节数:
char/unsigned char : 1个字节
short/unsigned short: 2个字节
long/unsigned long:4个字节
int/unsigned int:4个字节
float:4个字节
double:8个字节
占位符:
%p---------------------地址
%c---------------------char/unsigned char
%hd-------------------short
%hu--------------------unsigned short
%ld---------------------long
%lu---------------------unsigned long
%d---------------------int
%u---------------------unsigned int
%f或%g----------------------float
%lf或%lg---------------------double
%o------------------------------八进制
%x-------------------------------十六进制
'\n'----------------------换行
'\r'-----------------------回车
'\\'------------------------代表字符\
'\''-------------------------代表字符'
'\" '------------------------代表字符"
sizeof: 若int num=5;sizeof(num=10),最终num仍然等于5,不会修改任何存储区的内容
scanf:
scanf("%d",num); -----scanf这个标准函数需要包含stdio.h
scanf函数工作时计算机首先把用户输入的内容记录到输入缓冲区里,scanf函数从输入缓冲区里获得数字,先进入缓冲区里的数字一定首先被处理
如果用户输入的内容和程序希望的内容格式不一致,则有可能导致后面输入的内容得不到处理
可以采用如下两天语句把输入缓冲区里可能存在的无用数据丢弃:
scanf("%*[^\n]");
scanf("%*c");
printf函数首先把打印的数字放在输出缓冲区里,然后计算机把输出缓冲区里的内容显示在屏幕上
输出缓冲区里的内容只要在如下四种情况下才会出现在屏幕上:
1. 如果输出缓冲区里有'\n', 则它前面的内容会显示在屏幕上
2. 程序结束后,它放在输出缓冲区里的内容会显示在屏幕上
3. 当输出缓冲区被充满的时候,它里面的内容会显示在屏幕上
4.使用fflush(stdout)可以强制把输出缓冲区里的内容显示在屏幕上(scanf函数已经包含了fflush(stdout))
进制:
有符号类型数字的最左边二进制数位叫做符号位,符号位为0表示数字是非负数,符号位是1表示数字时候负数.
数据类型转换:当把占地大的整数类型数据赋值给占地小的整数类型存储区时,只会保留后面的二进制数位
当把占地小的有符号整数类型赋值给占地小的整数类型存储区的时候,多出来的二进制数位里天聪的都是符号位
eg1: char=300;
int num=char;
printf("num= %d\n",num);
结果:num=44.
原因分析:char=300,char只占用1个字节,而1个字节是8位,故1 0010 1100 ,故最左边的1去掉
int num=char,int占用4个字节,共32位,故0000 0000
0000 0000
0000 0000
0010 1100
进制相关转换:
二进制(非负数)-->十进制:把每个数位单独转换,然后把所有转换结果求和
eg: 001 101 010转化为十进制=2^1+2^3+2^5+2^6=2+8+32+64=106
二进制(负数)----->十进制:首先:计算出相反数的二进制
其次:把第一步的结果转换成十进制
最后:把第二步的结果再求相反数
eg: 1111 0010(负数)
1. 1111 0010 取反0000 1101
2. 加1=0000 1110
3. 得到十进制14
4. 取反=1-14
十进制(非负数)---->二进制:不停对数字除以2,保留整数部分的操作得到一组数字,其中每个数字再做除以2取余操作,得到每个数位上的内容,把所有余数按照从后向前顺序书写就得到转换结果.
eg: 106十进制转化为二进制为:106/2=53, 余数为0
53/2=26,余数为1
26/2=13,余数为0
13/2=6,余数为1
6/2=3,余数为0
3/2=1,余数为1
1/2=0,余数为1
从下往上为0101010, 故106的二进制结果=1101010
十进制(负数)-------->二进制:首先:得到负数的相反数
其次:把第一步的结果转换成二进制
再其次:把第二步中的每个数位上的内容变成相反内容
最后:把第三步的结果加1
eg: -14
1. -14取反得到14
2. 14的二进制=0000 1110
3.将0000 1110每位取反1111 0001
4. 再加1,得到1111 0010
二进制---------------->八进制:从右向左每三个数位分成一组,每组用0到7之间的一个数字替代就得到数字的八进制表示方式.
八进制必须用0(数字)作为开头, 用%o作为占位符
eg: 二进制1101010转化为八进制: 1101010------>001 101 010
0(开头) 1 5 2
故1101010转化为八进制为0152
二进制------------->十六进制:把二进制从右向左每四个数位分成一组,每组用一个字符替换就得到十六进制表示方式(如果转换结果在10-15之间,就用a到f之间的字符替换).
十六进制必须用0x作为开头,用%x作为占位符
eg: 1101010 转化为十六进制: 0110 1010
(0x) 6 a
八进制----------------->二进制:省略.
eg: 0152------->001 101 010
八进制----------------->十进制:省略
eg: 0152转化为十进制: 0152--------------二进制001 101 010
将二进制001 101 010转化为十进制=2^1+2^3+2^5+2^6=2+8+32+64=106
八进制----------------->十六进制:
eg:
操作符:
自增/减操作符:当数字使用时,前操作是修改后的数字,后操作是修改前的数字.
eg: int num=5;
int num1 = num++;
结果:num1=5, num=6.
int num2 = ++num;
结果: num=6,num2=6.
三目操作符:布尔值?公式一:公式二
若布尔值为真,则采用公式一计算,否则采用公式二计算
位操作符:~:把一个二进制表示方式所有二进制数位的内容求反
&:位与操作符,对应数位上的内容做与计算,只要两个数位有一个是0,则结果是0
|:位或操作符,只要一个数位的内容是1,则结果就是1
^:异或操作符,如果两个数位的内容一致,则结果是0,否则结果是1
右移位操作符:>>
左移位操作符:<<
移位操作符不会修改存储区的内容
有符号类型数据右移后,左边空出来的位置上一定补充符号位
无符号类型数据右移后,左边空出来的位置上一定补充0