1.数据类型介绍
1.整形家族
类型 | 字节数 | 取值范围 |
int(整形) | 4 | -2147483648~2147483647 |
short(短整型) | 2 | -32768~32767 |
long(长整型) | 4/8 | -2^31~(2^31-1) |
long long(双长型) | 8 | -2^63~(2^63-1) |
char | 1 | -2^7~(2^7-1) |
整形家族又分为无符号和有符号,int 其实为有符号整形,(signed)int , 有符号的我们一般会省略signed。
上表其实都为有符号类型。
类型 | 字节数 | 取值范围 |
unsigned int(无符号整形) | 4 | 0~(2^32-1) |
unsigned short(无符号短整型) | 2 | 0~(2^16-1) |
unsigned long(无符号长整形) | 4/8 | 0~(2^32-1) |
unsigned long long(无符号长整形) | 8 | 0~(2^64-1) |
unsigned char(无符号字符型) | 1 | 0~255 |
有符号类型和无符号类型的区别在于无符号类型将存放负数的内存全部放到正数上。
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
#sizeof是测量类型或变量长度的运算符,%zu是用来专门打印size_t类型的值,也就是sizeof的返回值。
char表示的是字符,但是char类型的本质是ASCII码值,实质为整形,所以划分到整形家族。
- 大写字母‘A’的ASCII代码是十进制数65,大写字母的范围在65~90。
- 小写字母‘a’的ASCII代码是十进制数97,小写字母的范围在97~122。
- 小写字母十进制数 = 大写字母十进制数 + 32
2.浮点数家族
只要是使用小数就可以使用浮点型。
类型 | 字节数 | 有效数字 | 数值范围(绝对值) |
float | 4 | 6 | 0以及1.2*10^(-38)~3.4*10^38 |
double | 8 | 15 | 0以及2.3*10^(-308)~1.7*10^308 |
long double | 8 | 15 |
0以及2.3*10^(-308)~1.7*10^308 |
long double | 16 | 19 | 0以及3.4*10^(-4932)~1.1*10^4932 |
- 不同的编译系统对long double型的处理方法不同,分配的字节也会有所不同。
意义:
- 使用这类型开辟空间的大小(大小决定了使用范围)
- 如何看待内存空间的视角
3.构造类型 (自定义类型-我们可以自己创造新的类型)
1.数组类型
int arr1[5]; 类型: int [5] int arr2[8]; int [8] char arr2[5]; char [5]
2.结构体类型 struct
3.枚举类型 enum
4.联合类型 union
4.空类型
void test(void) { printf("hehe\n"); } int main() { test(); return 0; }
第一个void 表示函数不会返回值
第二个void 表示函数不需要传任何参数
5. 指针类型
int* p; char* i;
2.整形在内存中的存储
1.权重
数值有不同的表现形式:二进制、八进制、十进制、十六进制。
用不同的进制报达十进制的 21
二进制:0b10101(0b表示该表示为二进制)
八进制:025(25前的0表示该表示为八进制)
十六进制:0x15(0x表示该表示为十六进制)
计算机的数值储存方式为二进制,int 的容量为4个字节,也就是32(2^8)个比特位,
每个位置用1或者0来表示21在计算机中就是:
00000000000000000000000000010101(一共32位数字)
可以类比10进制来理解什么是权重 十进制数字123,就可以看作1*10^2+2*10+3*1=123
而10^2就是1的权重,10就是2的权重,1就是3的权重。
2.原码 反码 补码(二进制)
计算机在操作数字时用的是补码。
正数的原码、反码、补码都是一样的。
int a = 21; //00000000000000000000000000010101-原码 //00000000000000000000000000010101-反码 //00000000000000000000000000010101-补码
负数的原码、反码、补码转换规则:
原码:直接通过正负的形式写出的二进制序列就是原码
反码:原码的符号位不变,其他位按位取反得到的就是反码
补码:反码+1就是补码
int b = -21; //10000000000000000000000000010101-原码 //11111111111111111111111111101010-反码 //11111111111111111111111111101011-补码
可以看到的是正数和负数是通过第一个比特位来区别符号的
类比:
10000000000000000000000000000001所表达的数为 -1
00000000000000000000000000000001所表达的数为 1
3.大小端介绍
个数据存放在内存中的方式,我们分为大端字节序和小端字节序
不同的编译器采用大端或者小端
大端字节序储存:
- 把一个数据的高位字节序的内容存放在低地址处,把低位字节序的内容放在高地址处,就是大端字节序。
int a =0x11 22 33 44(这里用十六进制是为了表达)
小端字节序储存:
- 把一个数据的低位字节序的内容存放在低地址处,把高位字节序的内容放在高地址处,就是小端字节序。
当然我会给大家验证:
我用的是mcvs,可以看到用的是小端字节序存储的,
内存界面看到的15 00 00 00是十六进制,是为了方便我们观察,实际上计入计算机的是二进制。