一,变量
(1)定义
存储类型 数据类型 变量名 在日常中存储类型一般省略,变量名是一个标识符
标识符规则:
1.由数字、字母和下划线构成
2.不能以数字开头
3.严格区分大小写
4.不能和C语言的32个关键字重复
(2)变量的初始化的赋值
int a;
a=100;//定义一个整型变量a,给他赋值,定义的时候没有给值
int b=100;//定义一个整型变量a并初始化,在定义的时候接给他值
二,类型转换
(1)隐式的强制类型转换(转换的过程是编译器做的)
char c='a';
int num=c;//隐式,把c变量的ascii 赋值给int类型的数据
//char 1Byte int 4Byte 小的char向大的int转换,可以执行
printf(“%d\n”,num);
unsigned int a=0xFFFFFFFF;//a是int型四个字节
unsigned short int b=a;//b是short int型两个字节
printf(“%u\n”,b);//此处如果执行的话,会导致a的左边两个字节丢失,不安全
(2)显式强转
格式:(强转的目标类型)强转的数据,(short)a
unsigned int a=0xFFFFFFFF;
unsigned short int b =(short)a;//显示出来强转的类型,看到过程
此处b接收0xFFFF后面四个F
(3)有符号和无符号之间的转换
属于隐式转换,当无和有一起运算时,强转成无符号。
unsigned int c=2;//无符号
signed int b=-3;//有符号
printf(“%u\n”,b+c);//计算时会先强转成无符号后在计算
结果:4294967295
原码:0000 0010 //int有32个bit位,这里简便理解一下,正负要补在数据类型的最高位
反码:0000 0010
补码:0000 0010//正数的原返补一样
-3->
原码:1000 0011
反码:1111 1100
补码:1111 1101
两个补码相加:1111 1111//实际上是32个bit位都是1即2^32-1=4294967295
unsigned int c=2;//无符号
signed int b=-3;//有符号
printf(“%d\n”,b+c);//%d也就是有符号,也是通过原码操作的,简便理解为-1
结果:-1
三,变量的取值范围
原码反码补码:计算机中数据都是以补码进行存储的
数据的最高位是符号位,0正,1负
正数原返补都一样
负数
反码;除了符号位不变,其位都反过来
补码:反码+1
0000 0010 + 1111 1101=1111 1111在这里最高位的1
(1)char=1Byte=8bit
无符号:【0,255】=【0,2^8-1】
有符号:【-2^7,2^7-1】
signed char c = 129
//存储看符号+
//原码:1000 0001
//反码:1000 0001
//补码:1000 0001
//取出看类型:
//补码:1000 0001
//反码:1000 0000 就是补码-1
//原码:1111 1111 最高位是1为负,负的就是除了最高位,其余全部取反
(2)short=2Byte=16bit
无符号数:[0,2^16-1]
有符号数:[-2^15,2^15-1]
有符号又分为正,负
正数[0,2^15-1]
负数[-2^15,0]
(3)int=4Byte=32bit
无符号数[0,2^32-1]
有符号数[-2^31,2^31-1]
正数[0,2^31-1]
负数[-2^31,0]
三,标准输出函数
(1)printf输出函数
(2)scanf输入函数
在获取多个字符时,需要吃掉垃圾字符(回车,空格,tab等)
函数原型
int scanf(const char *format, ...);
scanf("格式符",变量的地址);
//&:取地址符,取变量的地址
//scanf以回车作为获取结束的标志,只有缓冲区内的数据>=格式符的个数回车是结束的标志
//scanf从缓冲区内获取数据的标志,以空格、tab键和回车作为数据之间间隔的标志
#include <stdio.h>
int main(void)
{
char a,b,c;
scanf("%c%c%c",&a,&b,&c);/*这里只能输入123然后回车(记住这个回车算在下面的垃圾字符)若123
printf("a=%c\tb=%c\tc=%c\n",a,b,c);中有空格将出现垃圾字符*/
//比如在a后面打空格1 23 结果显示a=1 b=空格 c=2
scanf(" %c",&a);//%c前面的空格是可以吃掉垃圾字符的,上一个结果最后有个回车,会到这成为垃圾
scanf(" %c",&b);//吃掉打完1之后的回车
scanf(" %c",&c);
printf("a=%c\tb=%c\tc=%c\n",a,b,c);
getchar();//吃掉上一个c后面的回车,在%c中就是字符中,回车空格tab都是一个字符,%d随便打
scanf("%c",&a);
getchar();
scanf("%c",&b);
getchar();
scanf("%c",&c);
getchar();
printf("a=%c\tb=%c\tc=%c\n",a,b,c);
return 0;
}
(3)getchar()字符的输入函数
getchar()从终端获取单个字符
getchar(); //语句本身的结果就是从终端获取的字符
char c;
scanf("%c",&c);//通过scanf终端获取c
c=getchar(); //通过getchar终端获取c
就是只能获取一个字符,假设c=97,那么他获取9,还不是最终的,还要从ascii中找 到数字9对应的字符
(4)putchar()字符的输出函数
int main(int argc,const char *argv[])2
char c = 97;
putchar(c);//输出单个字符,不会换行
putchar(10);//输出换行
putchar('1');//输出字符‘1’,结果
return 0;
有符号最高位不参与计算,无符号参与计算
作业:
-57:按照char来写--32+16+8+1
原码:1011 1001
反码:1100 0110
补码:1100 0111
signed char c=178;//这一步完成178的存储为补码1011 0010
//178 char8个bit位
//存储看符号(正负,只看正负)+
原码:1011 0010//178在char中越界了,没有办法补0,直接算
反码:1011 0010//正数原反补一样
补码:1011 0010
printf("%d\n",c);
//取出看类型(此处为signed,有符号,则最高位1认为是正负号)
补码:1011 0010
反码:1011 0001
源码:1100 1110
-78
----------------------------------------------------------------------------
printf("%u\n",c);高位拓展(看类型,是signed,有符号,则全部拓展补码最高位的数)
拓展存储时的补码1011 0010
拓展后:1111 1111 1111 1111 1111 1111 1011 0010---拓展后的补码
当再进行下一步的时候就需要看%u,无符号,则拓展后的原反补都一样
计算机是对补码进行计算
所以把1111 1111 1111 1111 1111 1111 1011 0010的全部数都是计算位
即4294967218
unsigned char d=-9;
//-9 char 8个bit
//存储看正负-
原码:1000 1001
反码:1111 0110
补码:1111 0111//计算机都是对补码进行拓展的
printf("%d\n",d);
//取出看类型(unsigned无符号,即最高位不作为正负,所以前面全部补0)
拓展后的补码:0000 0000 0000 0000 0000 0000 1111 0111(0为正)
反码:0000 0000 0000 0000 0000 0000 1111 0111
源码:0000 0000 0000 0000 0000 0000 1111 0111
计算用补码计算:247
-----------------------------------------------
printf("%u\n",d);
取看类型(unsigned 无符号,最高位不作为正负,前面补0)
拓展后补码:0000 0000 0000 0000 0000 0000 1111 0111
然后看%u,无符号,即全部作为计算位247
【转+】C中的有符号数和无符号数之间的转换_有符号数和无符号数的转换_开心超人dev的博客-CSDN博客
C语言有符号数(signed)和无符号数(unsigned)运算时的转换过程——盲点_无符号数1-0xfffffffe_Let's GO Tiger的博客-CSDN博客