目录
1.存储的数据类型
(1) 整型
1.char 1 byte
2.short (int) 2 byte
3.int 4 byte
4.long (int) 4 byte
注:1.以上类型还可以衍生出 signed 与 unsigned 的版本。若无修饰,编译器一般默认为signed 类型。
2.signed/unsigned 只能修饰整型。
3.关于 char 是否默认为 signed,C语言并没有规定,其取决于编译器。同时,ASCⅡ码 码的范围是0~127,表示字符无需负数,故一般为 signed。
(2) 浮点型
1.float 4 byte
2.double 8 byte
3.long double 16 byte
(3) 构造型
1.数组
2.结构体类型 struct
3.枚举类型 enum
4.联合类型 union
(4) 指针型
1.float 4 byte
2.double 8 byte
3.long double 16 byte
(5) 空型
void,常用于函数的参数、返回类型、指针类型。
2.整型数据在内存中的存储
(1) 原码、反码、补码
计算机中以补码的形式对整型数据进行操作与存储。
补码的优势:
1.可以将符号位和数值域进行统一处理
2.加法和减法可以统一处理(故CPU只有加法器)
3.补码和原码的运算过程是相同的,不需要额外的硬件电路
而原码和反码的存在则是给补码的计算提供了一种方式。
(2) 大端、小端字节序
例子:
可实际上a的补码为FF FF FF F6,顺序不对,为什么?
这涉及到字节的存储顺序。
在计算机中,我们以字节为单位进行存储。以 int 为例,int 占4个字节,所以计算机在存储数据的过程中会把这4个字节按照一定的顺序进行存储。实际上,存储顺序并不重要,重要的是如何正确地将数据取出。为了简便,一般的存储方式分为大端字节序和小端字节序。
Ⅰ 大端字节序
存储模式:数据的低位字节存储在内存的高地址处, 高位字节存储在内存的低地址处。
KEIL C51采用大端字节序。
Ⅱ 小端字节序
存储模式:数据的高位字节存储在内存的高地址处, 低位字节存储在内存的低地址处。
X86结构以及多数ARM、DSP采用小端字节序。
(3) 练习题
一、
二、
三、
四、
五、
这是一个死循环
六、
七、
这也是一个死循环
(4) 练习题总结
1.题目的核心考点是强制类型转换时的数据截断和符号扩展。
2.本质上仍是对补码的操作与运算。
3.所有的数据类型均满足轮回,计算时需注意数据类型的范围。
3.浮点型数据在内存中的存储
(1) 例子
由此可见,浮点型数据与整型数据的存储方式不一样。
(2) 存储方式
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数 V 可以表达为以下形式:
V == (-1)^S * M * 2^E
说明:(以 float 为例)
1.S表示符号位,当S为1时表示负数,当S为0时表示正数,占1bit。
2.M表示尾数,即小数点后的数字,0 ≤ M < 1,占23bit。同时,由于本质为科学计数法,所以小数点前有一个省略的1,则实际M的有效位有24位。
3.E表示指数,为无符号整型,占8bit。
double 存储结构如下:
另外,将E从内存中取出还可以分成三种情况:
Ⅰ E不全为0或不全为1
此时,E的实际值为E-127 (1023)(因为E为一个无符号整型,但是指数可以出现负数,为了覆盖到负数的情况,将真实E的值加上127存入内存)
例子:
由于 0.5 == (-1)^0 * 1 * 2^-1
所以 S=0,M=0,E=-1+127=126
则 0.5 表示为 0 01111110 00000000000000000000000 == 0x 3F 00 00 00。
Ⅱ E全为0
此时,E = 1-127 (1023) = -126 (-1022)
有效数字M不再加上小数点前的1,而是表示为 0.xxxxxx 形式的小数
M的表示情况不变
这样是为了表示±0,以及接近于0的很小的数字。
Ⅲ E全为1
此时,如果有效数字M全为0,则表示 ±∞
(3) 回顾例子
第一次 * f = 00000000 00000000 00000000 00001001
由于 float 只表示小数点后6位,故表示为 0.000000。
第二次 * f = 9 = (-1)^0 * 001* 2^(3) = 0 10000010 00100000000000000000000
转化为整型即为 1091567616。