一,C语言的数据类型
1,内置类型
int char long longlong short float double等
2,自定义类型
二,数据的基本类型
1,整型家族
char类型
unsigned char,signed char
short类型
unsigned short,signed short
int类型
unsigned int,signed int
long类型
unsigned long,signed long
对于上面几个数据类型来说,unsigned都是无符号类型,signed都是有符号类型,
那么char本应该是字符类型,那为什么是属于整型家族的呢,其实char类型在内存中存储的是字符对于的assic码值,这样说是整型家族就理所当然了。
2,浮点型家族:
float:单精度浮点型
double:双精度浮点型
3,构造类型
数组类型(如int[10],char[5],数组的定义去掉数组名就是数组类型了)
结构体类型struct
枚举类型enum
联合类型union
4,指针类型
如int* p,char*p,float* p,void*p等
5,空类型
void表示没有类型,空类型,通常用于函数的返回值,函数的参数,指针类型等
三,整型在内存中是如何存储的
1,原码,反码,补码
计算机在整型的存储有三种方式,即原码,反码,补码
其中对于无符号数三者相同,对于正整数三者也相同
这三种表示方式均有符号位和数值位构成,符号位为0表示正数,符号位为1表示负数,则三种的数值位表示有所不同
原码:直接按照正负数的形式翻译成二进制得到原码
反码:除符号位其它位按位取反,得到反码
补码:反码+1得到补码
整型数据在内存中是以补码的形式存储的
看上图,整型在显示的时候是十六进制,并且是倒着放的,这是为什么呢?
这就不得不说一下大小端了
首先,什么是大小端呢?
内存编号小的叫低地址,编号大的叫高地址
大端存储模式:数据的低位存储在内存的高地址,数据的高位存储在内存的低地址
小端存储模式:数据的地位存储在内存的低地址,数据的地位存储在内存的高地址
这里存储顺序都是指的是字节
如:0x 11 22 33 44,高位是11,低位是44,并且地址右边是高地址,左边是低地址
则它的大端存储模式就是:0x 11 22 33 44
小端存储模式就是:0x 44 33 22 11
四,下面写一个代码判断某机器上是大端存储还是小端存储
思路:一个数字存储在内存中大小端不同,取出其存储在内存的第一个字节们就可以分辨了,访问一个字节可以用char*指针
我们已经知道1的大端存储和小端存储的值,则如上只需要取出第一个字节,就可以判断是大端存储还是小端存储了
下面用函数封装:
五,看几个习题
1,
-1的补码:11111111111111111111111111111111
a:11111111,b:11111111,c:11111111
由于a,b均为有符号数,则在整型提升的时候是会变成:11111111111111111111111111111111
而c是无符号数,整型提升补0,会变成:00000000000000000000000011111111
而这是补码,换成原码是:
a:10000000000000000000000000000001,即为-1
b:10000000000000000000000000000001,即为-1
c:00000000000000000000000011111111,即255
2,
这里首先是char为有符号数,在截断之后进行整型提升的时候要按符号位提,符号位是1,因此都提1,不是提升0,提升时要看原数据类型,以及其符号位,不能看截断之后的
注意:有符号char:-128~127
无符号char:0~255
2,3两个结果是一样的,这是什么原因呢?
是因为:对于char正数只能最大是127,128相当于127+1,而下图又说明了在127之后再+1,得到的是-128,也就是说这两个程序,本质上a都是-128