一、基本类型
系统分配给基本类型的变量的内存大小是固定的,C语言已经定义好了这个类型
1)整形
int 4个字节(32bits)
short 2个字节(16bits)
long
32位机器 4个字节(32bits)
64位机器 8个字节(64bits)
unsigned 无符号
代表所有的bit位都是数值
signed 有符号
最高位为符号位(只占1位) + 数值位
1 -> 负数
0 -> 正数
当CPU把数据进行运算时,不能直接把变量的数据进行计算的
需要先把数据拷贝到 CPU内部的寄存器(32bits)
再对寄存器的值进行计算
当变量的数据小于32bits时,
无符号的数拷贝到寄存器高位补0
有符号的数拷贝到寄存器高位补符号位
2)字符型
char 1个字节(8bits)
unsigned char 取值范围 0 ~ 255
(signed) char 取值范围 -128 ~ 127
例子:
char a = 260;
printf("%d\n", a); // 4
3)浮点型(实型)
float (单精度) 占4个字节(32bits)
31位(最高位)为符号位,占1bit, 1为负数,0为正数
30~23bit 为 指数段 ,占8bits ,指数加上127后 得到二进制数
22~0bit 为 尾数段 ,占23bits
例子:
float d = 3.14;
double(双精度) 占8个字节(64bits)
例子:
将十六进制数 0xC1480000 转换成浮点数
0xC1480000
--》 11000001 01001000 00000000 00000000
--》 1 10000010 1001000 00000000 00000000
符号位 指数段 尾数段
符号位: 1 --》 负数
指数段E: 10000010
1000 0010 --》 130 --》 130-127 --》 3 即实际的指数部分为3
尾数段M: 1001000 00000000 00000000
这里,在尾数的左边 省略存储了一个1,是以实际的尾数为
1.10010000000000000000000
把这三个部分的数据单独拎出来后,
通过指数部分E的值 来调整位数部分M的值
方法:
1、如果指数E为正数,尾数M的小数点就向右移
2、如果指数E为负数,尾数M的小数点就向左移
3、小数点的移动位数有指数的绝对值决定
此时 E为3,是一个正数,尾数M的小数点就向右移3位
1.10010000000000000000000
--》1100.10000000000000000000
至此,上面就是这个浮点数的二进制形式,然后再去转换成十进制
整数部分: 1100 ---》 12
小数部分: 10000000000000000000 --》 1 * 2^(-1) --》 0.5
==》 12.5
由于符号位为1,因此这个浮点数为 -12.5
注意:
在C语言中,整数的默认的类型为int,浮点数的默认的类型为double