一、数据类型
C语言中的数据分为:整形和浮点型。
以下是有符号类型和无符号类型能代表数据的范围:
/*整形*/
char //signed:-2^7~2^7-1 unsigned:0~2^8-1
short //signed:-2^15~2^15-1 unsigned:0~2^16-1
int //signed:-2^31~2^31-1 unsigned:0~2^32-1
long //int可以省略 signed:-2^31~2^31-1 unsigned:0~2^32-1
long long //int可以省略 signed:-2^63~2^63-1 unsigned:0~2^64-1
/*浮点型*/
float
double
char
类型是否是signed char
无明确定义,要看使用的编译器。- 除了整形和浮点型,还有自定义类型,指针类型,空类型。
二、整形在内存中的存储
(一)原码、反码、补码
符号位:0表示正,1表示负。
1. 原码:按照二进制,根据正负写出。
2. 反码:正数反码和原码相同。负数符号位不变,其他位按位取反。
3. 补码:正数补码和原码相同。负数在反码基础上+1,在计算机中存储的都是补码,负数补码的补码是原码
例子5和-5:
5原码: 00000000 00000000 00000000 00000101
5反码: 00000000 00000000 00000000 00000101
5补码: 00000000 00000000 00000000 00000101
-5原码: 10000000 00000000 00000000 00000101
-5反码: 111111111 111111111 111111111 111111010
-5补码: 111111111 111111111 111111111 111111011
(二)大小端
内存中是以字节为最小单元的,当数据类型如int4个字节,就会涉及如何排列这四个字节的问题。
- 大端:数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中。
- 小端:数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中(常用)。
可以看到在内存中,4的十六进制是0X00000004,04被保存在低地址。
编写程序验证大小端:
void test2()
{
int a = 1;
char* p = (char*)&a;
*p ? printf("小端") : printf("大端");
}
三、浮点型在内存中的存储
- IEEE754规定:二进制浮点数可以写成(-1)S*M*2E
5.5可以写成+101.1,即(-1)0*1.011*22
-5.5可以写成+101.1,即(-1)1*1.011*22 - 32位浮点数:1位符号位S,8位指数位E,23位有效数字M。
- 64位浮点数:1位符号位S,11位指数位E,52位有效数字M。
- 对于有效位M,不存储第一位的1,对于32位浮点数,即可以保存24位有效数字,对于64位浮点数,即可以保存53位有效数字。
- 由于指数位E可以是负数,存入指数E的真实值会加上一个中间数,对于32位,这个中间数是28-1 -1=127,对于64位,这个中间数是211-1 -1=1023。
- 当E全为0,有效数字的真实值为(1-127)或(1-1023),M位也不再补1.
- 当E全为1时,M全为0时,表示正负无穷大(具体看符号位)。