c基础day3

一,变量

        (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博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值