本帖最后由 niucaidi 于 2021-7-10 14:46 编辑
数据类型和数据存储
- 学习数据类型的三要素
- 存储数据的宽度
- 存储数据的格式
- 作用范围(作用域)
类型名 |
位数 |
字节数 |
char |
8bit |
1字节 |
short |
16bit |
2字节 |
int |
32bit |
4字节 |
long |
32bit |
4字节 |
整数类型分为有符号(signed)和无符号(unsigned)两种:
-
练习1:观察打印有符号数和无符号数有什么区别
char cTest = 0xFF;
unsigned char cuTest = 0xFF;
printf("%d\n%d",cTest,cuTest);
-
练习2:观察局部变量为有符号数和无符号数的运算结果
unsigned char i = 0xFF;
unsigned char j = 0x1;
if(i>j)
{
printf("i>j");
}
else
{
printf("i<j");
}
-
练习3:在反汇编中观察,体验数据宽度的概念
char cTemp = 0xFF;
short sTemp = 0xFF;
int nTemp = 0xFF;
char cTemp = 0x12345678;
short sTemp = 0x12345678;
int nTemp = 0x12345678;
总结:
1. 有符号数和无符号数在内存中的存储完全一样
2. 运算的结果会受到符号位的影响,需要在做类型转换 和数学运算 的时候尤为注意
-
将一个float型转化为内存存储格式的步骤为:
- 先将这个实数的绝对值化为二进制格式
- 将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
- 从小数点右边第一位开始数出二十三位数字放入第22到第0位。
- 如果实数是正的,则在第31位放入“0”,否则放入“1”。
- 如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。
- 如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。
-
作业:将float类型的12.5 转换成16进制
|