目录
一、数据类型
类型(整型) | 字节 | 类型(浮点数) | |
char | 1 | double | 8 |
short | 2 | float | 4 |
long | 4 | ||
int | 4 | ||
long long | 8 |
void是空类型,不能确定长度,不能直接定义变量,但是void*可以
%4.3lf表示输出4个数字,小数点后3位
二、原码 反码 补码
正数的原、反、补码相同
反码:原码符号位不变,按位取反
补码:反码+1
从补码到原码:(1)逆向计算(2)重新执行原码到补码的过程
数值一律用补码表示和存储
三、大小端
大端存储:数据的低位保存在高地址中,高位在低地址中
小端存储:数据的低位保存在低地址中,高位在高地址中
四、整型提升与隐式类型转换
整型提升:对于所有比int小的类型(char,signed char,unsigned char,short,unsigned short)会先提升为int,按照变量的符号,高位补符号位,无符号变量则补0
隐式类型转换:
(1)算术转换
运算时,以表达式中最长的类型为主进行转换
(2)赋值转换
右边数据类型长度大于左边,则进行截断
(3)输出转换
输出的数据与输出格式不符,会自动进行类型转换
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
上述代码,会发生整型提升,a,b是有符号char类型,以int型输出先转为原码1111...1111->1000....1->-1;c是无符号char类型,0000....1111 1111->255.所以结果是a=-1,b=-1,c=255
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
上述代码,128的二进制是1000....1000 0000,存入a中为1000 0000,以无符号整型输出,发生整型提升,高位补1,为1111....1000 0000,输出是一个较大的数4294967168
int i= -20;
unsigned int j = 10;
printf("%d\n",i+j);
上述代码输出仍为-10,底层运算时,两个整数的任何类型进行计算都是两个二进制进行计算
tips:char的取值范围是[-128,127],-128在存储时转为补码1 1000 0000,char类型只有8个比特位所以-128存进去是1000 0000,所以1000 0000用来表示-128补码而不是-0
五、浮点数存储
浮点数存储先转为二进制后以标准形式存储,存入S、E、M
(-1)^S*M*2^E
其中(-1)^S表示符号位,(S=0,为正数;S=1,为负数);
M表示有效数字,2>M≥1;占23位
2^E表示指数位,占8位
对于double型,E为8位,要加中间数127;对于float型,E为11位,中间数是1023
例如:a=9.0存储时,9.0转为二进制是1001.0,即(-1)^0*1.001*2^3,S=0,E=127+3=130,M=1.001,存储M时保留小数点后的,所以a存储时会是0 1000 0010 0010 0000....
如果化为上述形式后E不全为0或1,则可以倒推到原来的数字;E全为0,则有效数字M不加1,而是还原成0.xxxxxx的小数;E全为1,M全为0,表示无穷大