1.数据类型的详细介绍
1 .整型家族
char 并不等于 signed char(常见的编译器下就相等)
char到底是signed char还是unsigned char是取决于编译器实现的
2.浮点数家族
long double
3.构造类型(自定义类型)
数组类型
结构体类型 struct
枚举类型 enum
联合类型 umion
4.指针类型
5.空类型
void表示空类型(无类型)
通常用于函数的返回类型、函数的参数、指针类型
_Bool 布尔类型,实际上还是int类型,只是将1定义为true,将0定义为flase(C99)
2.整型在内存中的存储
2-1.原码、反码、补码
计算机中的整数有三种表示方法,即原码、反码、补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示"正",用1表示"负",而数值位负整数的三种表示方法各不相同。
2-1-1.原码
按照一个数的正或负直接写出来的二进制就是原码
2-1-2.反码
符号位不变,其他位按位取反
2-1-3.补码(内存中储存)
反码的二进制序列 + 1,得到补码
整数的原、反、补码相同
对于整型来说:数据存放内存中其实存放的是补码
在计算机系统中,数值一律用 补码来表示和存储。使用补码,可以将符号位和数值域统一处理;
同时加法和减法也可以统一处理(CPU只有加法器),此外,补码与原码 相互转换,其运算过程是相同的,不需要额外的硬件电路。
计算机中只有加法器
减、乘、除法用加法模拟出来 1-1 --> 1 + (-1)
3.大小端字节序介绍及判断
3-1.什么是大端小端
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中
int main()
{ -1 --> 11111111111111111111111111111111-->(截断) 11111111 --> a, b, c
char a = -1; --> 11111111 -->(整型提升) 11111111111111111111111111111111
-->1111111111111111111111110 -->100000000000000000000001--> -1
signed char b = -1; 同上
unsigned char c = -1; -->
11111111 -->(整型提升) 00000000000000000000000011111111 -->255
printf("a=%d b=%d c=%d", a, b, c) // a=-1 b=-1 c=255
}
int main()
{ -128 --> (原码)100000000000000000000000010000000 -->
(补码)111111111111111111111111110000000 --> (截断)10000000
char a = -128; 10000000 -->(整型提升) 11111111111111111111111110000000
printf("%u\n", a); 4294967168
}
4.浮点型在内存中的存储解析
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成以下形式:
(-1)^S * M * 2^E
(-1)^S 表示符号位,当 S = 0,V位正数;当 S = 1,V为负数
M 表示有效数字,大于等于1,小于2
2^E 表示指数位(会进行修正,再存储 23bit + 127 52bit + 1023 )
M中第一位总是1,所以默认为1,23个bit全存小数点后的数 对于32位的浮点数,最高1位是符号位S,接着8位是指数E,剩下23位为有效数字M
(浮点数无原、反、补码) 对于32位的浮点数,最高1位是符号位S,接着11位是指数E,剩下52位为有效数字M
5.5
5 --> 101
0.5 --> (2^-1) --> (二进制) 0.1 (0.01(二进制) --> 2^-2 --> 0.25(十进制)))
5.5 --> 101.1
5.5 --> 1.011 * 2^2
5.5 --> (-1)^0 * 1.011 * 2^2