目录
一,类型的基本几种:
整型大家庭:char,又分为 unsigned char,signed char
short 又分为unsigned short,signed short
int 又分为unsigned int,signed int
long 又分为unsigned long,signed long
浮点数家庭:
float
double
构造类型家庭:
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型家庭:
int* pi;
char* pc;
float* pf;
void* pv;
空类型家庭:
void表示空类型(无类型)
通常应用于函数的返回类型,函数的参数,指针类型。
二,原码,反码,补码
原码:将数值按照正负数的转换成二进制即可
反码:将原码的符号位不变,其他位依次按位取反即可
补码:反码+1就是原码
正数的原码,反码,补码,都是相同的
对于整型来说,数据存放的都是补码
三,整型提升
概念:c的整型算术运算总是至少以缺省整型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换就是整型提升。、、
方法:整型提升是按照变量的数据类型的符号位来提升的
举个例子:
负数的整型提升 ,,,char a = -1;
在存储时,只有一个字节,二进制位只有8个比特位,存储是以补码形式存储,1111 1111
所以整型提升的时候,高位补充符号位,即为1。
提升之后结果是4个字节,32个比特位
1111 1111 1111 1111 1111 1111 1111 1111
正数的整型提升,char b = 1
变量的二进制位有一个字节,也就是8个比特位,0000 0001
符号位是0,那就补0
0000 0000 0000 0000 0000 0000 0000 0001
就是这样,如果定义的是无符号数,在补码时整型提升,直接补0,因为没有符号位的概念。就补0就行
四,大小端介绍(大学老师指定不爱讲的知识)
大端(存储)模式:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端模式:数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中
存在的意义:
1,在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8个bit位。但是c语言里面,除了8bit的char之外,还有16bit的short型,32bit的long型。
2,此外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那必然存在一个如何将多字节安排的问题。因此就导致了1大端存储模式和小端存储模式
举个例子形象点吧:
一个16bit的short型的x,在内存中的地址为0x0010(右边是低地址,左边是高地址),x的值为0x1122,那么0x11为高字节,0x22为低字节。
在大端模式下:把0x11放在低地址中,就是0x0010中,而0x22放在高地址中,0x0011(比之前的往后挪了一个)。。。。小端模式恰好相反。
我们常用的x86结构是小端模式,而keil c51为大端模式(测控,自动化类专业应该熟悉,51单片机)。很多的ARM,DSP都为小端模式。
五,大小端知识的用处
讲了这么多,还是关心他的实用性,这才是最是真实的。。。
许多互联网公司,大厂也好,中厂也好,面试的时候,会有手撕代码的流程。其中他们就喜欢搞这些概念性的知识理解,用它们去出题。
依靠大学老师那种念PPT的教课,去面试,等于送人头。这种知识上课根本不谈,就只说一些期末考试的东西罢了。
百度这种厂子,在前几年就有一道笔试题,
简述大小端字节序的概念,并设计一个程序来判断当前机器的字节序。。
先搞主函数最简单,逻辑上表达清楚就行:
难就难在对于调用函数的设计实现了
思路是:肯定得用到指针,地址这方面知识,并且还要区分高字节,和低字节。并能看到他们的存储位置。要不,定义一个整型,从里面截取一个,是不是可以了。对没错。如图即可
1,先定义一个整型
2,强制类型转换,把int*类型,转换成char*
3,截取到了一个字节,这是在低地址上截取的一个字节
4,本来 00 00 00 01 取一个低地址后,是1 ,01是低字节
5,低字节,保存在低地址中,那就是小端了
六,关于unsigned一系列的深度学习
首先,打印signed整型是用%d来打印,而打印unsigned int 是用%u来打印。。。
只要不加unsigned 的类型,一律默认是有符号数,比如 +2 和2 都是一个意思,只有加-号,-2才是负数。。。。单独说2 就是正2
1,如题,
解析:a和b不用过多接受,该是啥就是啥,他俩一个意思,上面解释过了。
c因为是定义的无符号字符,存放时,是以补码的形式存放,-1的补码是1111 1111,但是由于定义时是无符号数,没有符号位的概念,输出时,直接这个就是正数了,直接打印就行,输出十进制,转化十进制就是255。
2,如题:
这题答案看似离谱,其实合理,得涉及到整型提升的知识点。查看目录三。128的存储时的二进制位是,(补码)1000 0000,,要打印的是,无符号整型%u,这可是4个字节,char不够啊,一个字节,怎么变成4个字节呢。。。整型提升,
1111 1111 1111 1111 1111 1111 1000 0000,这是补码的状态下,因为要打印十进制位,要把他转化为原码,因为是正数,所以还是1111 1111 1111 1111 1111 1111 1000 0000
十进制就是4294967168
再来一题狠的:
按照正常思维,应该是1000,怎么也该循环一千次,数组里面应该放一千个数,长度是一千。
但是,忽略了一个重要的地方,这是定义的字符数组,char的范围是-128--127,一共是255个数,不能超出这个范围,
-1 ,-2 ,,,-128过后就是127,126 ,125,,,,1,0到0就结束了。
肯定有人问,再来一圈啊,还能循环几圈,理论上是这样的,但是这是char类型,并且有strlen的限制下,它到0 也就是’\0‘就结束咧,(’\0'的ascll码是0)
所以这题只能从-128到127再到0,往后没了,结束咧,正好是255.。。。。。
这题杀伤力很大,需要大伙,细品细品。。。