文章目录
- 1. 数据类型介绍
- 类型的基本归类
- 2. 整型在内存中的存储:原码,反码,补码
- 2.1. 原码,反码,补码
- 2.2. 大小端介绍
- 大端字节序存储
- 小端字节序存储
- 例:设计程序判断是大端还是小端?
- 2.3. 练习
- 练习1
- 练习2
- 练习3
- 练习4
- 3. 浮点型在内存中的存储
1. 数据类型介绍
数据类型 | 数据类型 | 字节 |
---|---|---|
char | 字符数据类型 | 1 |
short | 短整型 | 2 |
int | 整型 | 4 |
long | 长整型 | 4/8 |
long long | 更长的整型 | 8 |
float | 单精度浮点数 | 4 |
double | 双精度浮点数 | 8 |
- 类型的意义:
1.使用这个类型开辟空间的大小.(大小决定了适用范围).
2.如何看待内存空间的视角.
类型的基本归类
整型家族://字符的本质是ASCII码值,是整型,所以划分到整型家族.//char到底是signed char 还是unsigned char 标准是未定义的,取决于编译器的实现.charunsigned charsigned charshortunsigned short [int]signed short [int]int//int a; <---> signed int a;unsigned intsigned intlongunsigned long [int]signed long [int]long long1unsigned long long [int]signed long long [int]
浮点型家族:只要表示小数就可以使用浮点型
float 的精度低,存储的数值范围比较小,
double 的精度高,存储的数组范围比较大
构造类型: 自定义类型-可以自己创建出新的类型数组类型结构体类型 struct枚举类型 enum联合类型 union
指针类型:int *pi;char* pc;float* pf;void* pv;
空类型: voidvoid test(void);//第一个void 表示函数不会返回值//第二个void 表示函数不需要传任何参数
2. 整型在内存中的存储:原码,反码,补码
- 数值的表示
- 2进制 0b10101
- 8进制 025
- 10进制 21
- 16进制 0x15
2.1. 原码,反码,补码
-
整数的2进制也有3种表示形式:
- 符号位+数值位,符号位为0表示"正", 为1表示"负".
- 1.正的整数,原码,反码,补码相同
- 2.负的整数,原码,反码,补码需要计算.
- 原码: 直接通过正负的形式写出二进制序列就是原码
- 反码: 原码的符号位不变,其他位按位取反
- 补码: 反码+1
-
整数内存中存补码的2进制
- 为什么?
- 使用补码,可以将符号位和数值域统一处理
- 同时,加法和减法也可以统一处理(CPU只有加法器).
- 补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路.
int a = 20; //20 //00000000 00000000 00000000 00010100 //0x 00 00 00 14 //原码,反码,补码相同//int b = -10; //-10 //10000000 00000000 00000000 00001010 -- 原码 //11111111 11111111 11111111 11110101 -- 反码 //11111111 11111111 11111111 11110110 -- 补码 //0x ff ff ff f6
在内存窗口查看20,-10的地址中存储的数据
2.2. 大小端介绍
大端字节序存储
- 把一个数据的高位字节序的内容存放在低地址处,
把低字节序的内容存放在高地址处,就是大端字节序存储.
小端字节序存储
- 把一个数据的高位字节序的内容存放在高地址处,
把低字节序的内容存放在低地址处,就是小端字节序存储.
例:设计程序判断是大端还是小端?
```//*(char*)&a --> int*//check_sys();int check_sys(){int a = 1;return *(char*)&a;}int main(){int ret = check_sys();if (ret){printf("小端\n");}else{printf("大端\n");}return 0;}```
2.3. 练习
练习1
char a = -1; signed char b = -1; //-1是整数//10000000 00000000 00000000 00000001 -- 原码//11111111 11111111 11111111 11111110 -- 反码//11111111 11111111 11111111 11111111 -- 补码//存到char,截断,取低地址的后8位//11111111//%d --打印有符号的整型//整型提升,char有符号,补符号位1//11111111 11111111 11111111 11111111 -- 补码//10000000 00000000 00000000 00000000 -- 反码//10000000 00000000 00000000 00000001 -- 原码//-1unsigned char c = -1; //整数-1,截断后存unsigned char//11111111//%d打印整型//整型提升,数据类型为无符号整型,补0//00000000 00000000 00000000 11111111 -- 整数//255printf("%d %d %d\n",a,b,c);//-1 -1 255``````signed char : -128~127补码:0~2^7,-1~-2^7原码:0~127,-128~-1 unsigned char: 0~255unsigned short: -32768~0~32767signed short: 0~65535
练习2
char a = -128;printf("%u\n", a); //4,294,967,168//-128整数//10000000 00000000 00000000 10000000//11111111 11111111 11111111 01111111//11111111 11111111 11111111 10000000//放char//截断//10000000//整型提升//11111111 11111111 11111111 10000000//%u 打印无符号整数//4,294,967,168
练习3
char a = 128;printf("%u\n", a);//128整数//00000000 00000000 00000000 10000000//截断//10000000//整型提升--看a的类型//11111111 11111111 11111111 10000000 //%u 打印无符号整数//4,294,967,168
练习4
int i = -20;unsigned int j = 10;printf("%d\n",i+j);//-10//-20//10000000 00000000 00000000 00010100//11111111 11111111 11111111 11101011//11111111 11111111 11111111 11101100//10//00000000 00000000 00000000 00001010////-20+10//11111111 11111111 11111111 11101100 -- -20//00000000 00000000 00000000 00001010 -- 10//11111111 11111111 11111111 11110110 -- 补码//10000000 00000000 00000000 00001001//10000000 00000000 00000000 00001010 -- -10
3. 浮点型在内存中的存储
- 浮点数家族:flloat, double, long double类型.
- 浮点数存储规则:
- 国际标准IEEE754:,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。M表示有效数字,大于等于1,小于2。2^E表示指数位。