文章目录
- 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 标准是未定义的,取决于编译器的实现.
char
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
//int a; <---> signed int a;
unsigned int
signed int
long
unsigned long [int]
signed long [int]
long long1
unsigned long long [int]
signed long long [int]
浮点型家族:只要表示小数就可以使用浮点型
float 的精度低,存储的数值范围比较小,
double 的精度高,存储的数组范围比较大
构造类型: 自定义类型-可以自己创建出新的类型
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型:
int *pi;
char* pc;
float* pf;
void* pv;
空类型:
void
void 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 -- 原码
//-1
unsigned char c = -1;
//整数-1,截断后存unsigned char
//11111111
//%d打印整型
//整型提升,数据类型为无符号整型,补0
//00000000 00000000 00000000 11111111 -- 整数
//255
printf("%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~255
unsigned short: -32768~0~32767
signed 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表示指数位。