C语言学习笔记(重温重点三)

三数据类型

  1. 进制:计算机常用的进制形式为二进制、八进制和十六进制。n进制就是逢n进一。
    进制转换:
    换算成十进制时:按权相加
    二进制转换成八进制:每三位一组
    八进制转换成二进制:每一位八进制数对应三位二进制数
    二进制转换成十六进制:每四位一组
    十六进制转换成二进制,每一位十六进制对应四位二进制数
    十进制转换成二进制:整数:除以2取余,逆序排列即可得到二进制。
    小数:乘以2取整,顺序排列即可得到二进制。

原码:有符号最高位为符号位,其余各位为数值本身的绝对值
无符号就是数据的绝对值
反码:正数:反码与原码相同
负数:符号位为1,其余位对原码取反
补码:正数:原码、反码、补码相同
负数:最高位为1,其余位对原码取反,再对整个数加1
计算机系统中,数值全都用补码表示。
思考:使用补码的好处???:补码的好处就是计算机的表达位数可以充分利用进而表示更多的十进制数。首先加入没有补码,+0 在计算机中的表示0 000 0000. -0 在计算机中的表示1 000 0000. 并不一致。其次我们知道8位二进制的表示形式总共有0000 0000-1111 1111 那么多,恰好是2^8=256. 也就是说理论上可以表示256个十进制数字。我们前面知道,-0 在计算机中如果再用原码 就是1 000 0000 。如果采用反码就是1 111 1111. 会多占用一个表达。
4.有符号数:%d
无符号数:%u
注:赋值号“=”的本质就是二进制的拷贝。
5.short和int在32位一下的操作系统上是等价的
Long和int在32位及以上的系统中是等价的
6.printf("%d,%d",sizeof(1.0),sizeof(1.0f));//数字后不加f时默认为double类型,加上为float类型
注:printf中0,l(小写字母l)用来填充或者用来输出对其等;在位宽的数字前加入0表示在输出一个小于位宽的数值时,将在前面补0使其总宽度为设定的位宽;%-d表示输出为左对齐,否则为右对齐。

7.字符及字符串常量
A.字符常量:
putchar(’\r\n’);//回车换行,只有此语句时会将原有行的从前到后覆盖部分或全部。
B.字符串常量:

//字符串:用双引号括起来的字符序列
	printf("%d\n",sizeof(""));//每个字符串尾部自动加入‘\0’作为字符串的结束标志,空字符//串有一个结束标识\0字符,因此占一个字节
	printf("%d\n",sizeof("1"));//有一个字符串1,加一个结束标识符\0字符,因此占两个字节

C.字符‘1’代表一个形状为‘1’的符号,在需要时按照原样输出,在内存中以ASCII码的形式存储,占一个字节00110001;
整数 1 是以整数存储方式(二进制补码方式)存储的,占2个或4个字节(32位系统和64位系统不同)。
D.

char ch = 'A';
printf("%c,%d\n",ch,ch);
ch = ch + 1;        //ch是字符’A‘,字符A对应整数65,65+1=66,所以ch的值为66,66对应的字符就是B
printf("%c,%d\n", ch, ch);

E.字符串常量不允许赋值给字符型变量,C语言中没有专门的字符串变量,在内存中存取字符串只能使用数组(字符数组)或指针。
F.32-126号字符可见,字符的编号即ASCII码。
G. //特殊

char ch1 = '0';
char ch2 = 0;//编号为0的字符就是’\0‘
char ch3 = '\0';

printf("%c,%d\n", ch1, ch1);//字符’0‘按照整数就是编号48(ASCII码),按照字符是本身
printf("%c,%d\n", ch2, ch2);//字符0就是一个为空的字符,字符按照整数输出就是编号为0
printf("%c,%d\n", ch3, ch3);//字符’\0‘就是一个为空的字符,字符按照整数输出就是编号为0

H.空格符编号为32,‘\0’什么都不输出
8.基本数据类型
来自传智播客视频

注:整数可以求余,double类型不可以求余运算。
9.数据类型转换

//自动类型转换
1.低字节向高字节转换,极限范围小的向极限范围大的转换
//char ch = 'A';
//short sh = 10;
//int num = 100;
//float fl = 1.0;
//double db = 10000.0;
//printf("char%d,short%d,int%d,float%d,double%d\n", sizeof(ch), sizeof(sh), sizeof(num), sizeof(fl), sizeof(db));
//printf("%d,%d\n", sizeof(ch + num), ch + num);//'A'+num,先将'A'转换int类型,即65,再与num(100)相加,即char类型转换int类型
//printf("%d,%d\n", sizeof(sh + num), sh + num);//short类型转换成int类型
//printf("%d,%d\n", sizeof(num + db), num + db);//int类型被转换成double类型
//printf("%d,%d\n", sizeof(num + fl), num + fl);//int类型被转换成float类型
//printf("%d,%d\n", sizeof(fl + db), fl + db);//float类型被转换成double类型

char、short会直接转换成为int,char不会转换成short
//printf("%d,%d\n", sizeof(ch + sh), ch + sh);
32位操作系统下int与long等价的,在一些老版本操作系统,int占两个字节,会进行int向long转换

数据较大,会从有符号转换成无符号(int到unsigned int)
//unsigned int unum = 4294967000u;//u标注无符号常量的作用
//printf("%d,%u,%d\n", sizeof(num + unum), num + unum, num + unum);//打印出-196说明超出了int(%d)的表示范围,所以出错,而无符号int可以正常显示。
int到float到double

2.赋值时进行了数据类型转换,赋值号会自动将右边表达式、常量、变量等转换成左边变量类型。大数据会自动转换成小数据,小数据也会转大数据
//char ch = 'A';
//short sh = 66;
//int num = 100.0;
//double db = 100;
//printf("ch=%c,sh=%d,num=%d,db=%f\n", ch, sh, num, db);
//printf("%d,%d\n", sizeof('A'), sizeof(char));//'A'保存的时候保存的是字符A的ASCII码,按照整数来保存的,整数占4个字节,char类型占1个字节
//printf("%d,%d\n", sizeof(66), sizeof(short));//66保存的时候保存的是整数,整数占4个字节,short类型占2个字节
//printf("%d,%d\n", sizeof(100.0), sizeof(int));//100.0保存为double类型,占8个字节,int占4个字节
//printf("%d,%d\n", sizeof(100), sizeof(double));//100保存为整型,占4个字节,double占8个字节


//强制类型转换
/*一般形式
(int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
*/
int x = 100;
int a = 1.0f;//赋值号自动实现类型转换 
printf("%d\n",a);

printf("%d\n", 1.0);//将double类型的数据1.0按照整数来解析,所以结果为0
printf("%d\n", sizeof(1.0));//1.0默认为double类型,因此占8个字节

printf("%f\n", 1.0);
printf("%f\n", 1);
printf("%d\n", (int)1.0);
printf("%d\n", (int)(1.0 + 'A'));

//注:1.精度损失问题
printf("%d,%d,%d\n", (int)3.4, (int)3.5, (int)3.6);//结果全是3,不符合四舍五入

printf("%f\n", (float)x);//(float)x是一个中间变量,进行数据转换的时候,不影响变量x本身的值
printf("%d\n", x);

//2.数据溢出
//计算机本质就是二进制的赋值,极限范围内是正确的,超出极限就不能保证结果是正确的
//unsigned char类型最大值为255,
printf("%d,%d,%d\n", (unsigned char)255, (unsigned char)256, (unsigned char)257);//输出为255,0,1

printf("%u\n", -1);//4294967295

printf("%d,%u,%o\n", x, x, x);//整型,无符号型,八进制

printf("%.4f\n", m);//四舍五入

printf("%f,%f\n", FLT_MIN, FLT_MAX);//打印float的极限值,并不是最大最小值,而是能表示数据的精确度
printf("%f,%f\n", DBL_MIN, DBL_MAX);//float,double都是表示数据的准确度

//整数是采用补码的形式存储的
//浮点数是采用指数形式存储的

注:1.面试嵌入式开发就需要掌握补码的原理,计算机本质就是二进制的赋值,极限范围内就是正确的,超出范围就不能保证是正确的。
2.printf本质,不管原来的数据是什么类型,它统一按照自己的方式来解析,指定%d就是%d,指定%u就是%u等。
3.格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。格式字符有d,o,x,u,c,s,f,e,g等。如:
%d整型输出,
%ld长整型输出,
%o以八进制数形式输出整数,
%x以十六进制数形式输出整数,
%u以十进制数输出unsigned型数据(无符号数)。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数,以小数形式输出,(备注:浮点数是不能定义精度的,所以“%6.2f”这种写法是“错误的”!!!)
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。
scanf(控制字符,地址列表)
格式字符的含义同printf函数,地址列表是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。如scanf("%d%c%s",&a,&b,str);。
10.类型提升问题:char,short字符,无论有无符号,在表达式都会转换为int或者unsigned int类型。
11.可以跨平台移植的整数类型:stdint.h
不同的平台,不同的编译器,同样的一个整数数据类型,可能大小不一样
int 16位的情况下是2个字节,32位是4个字节
Long 64位linux情况下是8个字节,win32和win64都是4个字节
12.

#include<stdbool.h>//支持C语言的bool类型变量
_Bool bool1,bool2;
_Bool bool3 = 5 > 3;
bool1 = true;
	bool2 = false;
	printf("%d,%d\n",bool1,bool2);//1,0
printf("%d,%d,%d\n",sizeof(bool1),sizeof(bool2),sizeof(bool1+bool2));//1,1,4
if (bool3)
{
	printf("成立\n");
}
else
{
	printf("不成立\n");
}

13.//分别输出三种数据类型的极限

#include<limits.h>//极限的头文件
#include<float.h>//浮点数极限值存放的头文件
	printf("%f,%.50f\n", FLT_MAX, FLT_MIN);
	printf("%lf,%.500lf\n", DBL_MAX, DBL_MIN);
	printf("%Lf,%.500Lf\n", LDBL_MAX, LDBL_MIN);
	//Windows平台,VS2013,double与long double等价
	//某些场合long double是16个字节
	//float类型只能精确到小数点后六位,六位以内一定正确,以外不一定。
	//double类型只能精确到小数点后十五位,以后不一定正确。

14.DOS命令行打开同一应用程序的多个窗口。

15.99,99l在32位系统下是一样的都为四个字节,在某些嵌入式系统中99为两个字节,99l为四个字节。
16.自动变量与静态变量
自动变量:
函数调用的时候就存在,函数结束的时候就终止。地址都是同一地址,但是内容却反复变化。
自动变量只在定义它们的时候才创建,在定义它们的函数返回时系统回收变量所占存储空间,对这些变量存储空间的分配和回收是由系统自动完成的。一般情况下,不作专门说明的局部变量,均是自动变量,自动变量也可用关键字auto作出说明;块语句中的变量,函数的形式参数,都是自动变量。
auto用于软件开发工程规范,让代码更清晰,如果只是为了程序可以跑起来,可加可不加。
静态变量:
一直存在,值没有变化,地址也没有变化

void go1(int num)
{
	printf("%x,%d,%d\n", &num, num, sizeof(num));
	/*return num;*/
}
void go2(auto int num)//加入auto更加标准
{
	auto int data = num;
	printf("%x,%d,%d\n", &num, num, sizeof(num));
	printf("%x,%d,%d\n", &data, data, sizeof(data));
	/*return num;*/
}
void staticrun()
{
	static int x = 0;
	printf("%x\n", &x);
}
void autorun()
{
	auto int x = 0;
	printf("%x\n", &x);
}
void main()
{
	go1(5);
	printf("\n");
	autorun(10);
	printf("\n");
	staticrun(15);
	printf("\n");
	system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值