1、数据类型的介绍
基本数据类型有:char 、short 、 int 、long 、long 、 float 、double
基本数据类型归类:
整形: char (unsigned char 、 signed char )
short(unsigned short [int] 、 signed short [int])
int (unsigned int 、 signed int)
long(unsigned long [int]、signed long [int])
浮点型
:float 、 double 、 long dou
构造类型:
数组类型 例如:arr[5];
结构体类型
枚举类型 enum
联合类型 union
指针类型:
int *a
;
char *a
;
float* a
;
void* a
;
空类型:
void (表示类型为空)
用于函数的返回类型、函数的参数、指针类型
2、整形在内存中的存储
2.1原码、反码、补码
正数的原反补码 相同
例如:5的原反补码用32位二进制表示为0000 0000 0000 0000 0000 0000 0000 0101
原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:反码+1就得到补码。
计算机在
存储
有符号整数时,通常使用
补码形式
(存储)。在进行
算术运算
时,也是基于
补码
进行的,运算结果以补码形式表示,展示给用户看的是
原码
。
内存中的存储:整型变量a 、b


int main()
{
//20
//0000 0000 0000 0000 0000 0000 0001 0100(正数的原反补相同,符号位为0)
int a = 20; //——>0x00 00 00 00 00 00 01 40
//-10
//1000 0000 0000 0000 0000 0000 0000 1010 补码(直接转成二进制,负数符号位为1)
//1111 1111 1111 1111 1111 1111 1111 0101 反码(原码基础之上,符号位不变,其余位取反)
//1111 1111 1111 1111 1111 1111 1111 0110 补码(反码+1)
int b = -10;//在内存中的存储是 补码 ——> 0xff ff ff ff ff ff ff f6
}
为什么反着放呢?(14 00 00 00...)
因为这是小端存储。下面进行大端、小端介绍
2.2 大小端介绍
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地
址中。
如何判断是大端还是小端?
int check_sys()
{
int i = 1;
//*是解引用操作符,它会从 (char*)& i 所指向的内存地址(即 i 的起始内存地址)读取1字节的数据
return (*(char*)&i);
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
3、浮点型在内存中的存储
它们在内存中的存储遵循IEEE 754标准,
(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。
32
位的浮点数,最高的
1
位是符号位
s
,接着的
8
位是指数
E
,剩下的
23
位为有效数字
M
。
64
位的浮点数,最高的
1
位是符号位
S
,接着的
11
位是指数
E
,剩下的
52
位为有效数字
M
float 类型:
符号位(Sign)S:占1位,位于最高位。0表示正数,1表示负数。
指数位(Exponent)E:
占8位,指数采用移码表示,偏移量为127。比如实际指数为3,存储的指数值就是3 + 127 = 130,即二进制的1000 80010。
占11位,偏移量为1023。比如实际指数为3,存储的指数值就是3 + 1023 = 1026,即二进制的100 0000 0010。
尾数位(Mantissa)M:占23位,用于表示小数部分。规定有效数字最高位总是1,这个1默认不存储,比如对于 小数1.101, 实际存储的是101,在计算时会自动加上前面省略的1。
尾数位(Mantissa)M:占23位,用于表示小数部分。规定有效数字最高位总是1,这个1默认不存储,比如对于 小数1.101, 实际存储的是101,在计算时会自动加上前面省略的1。
上栗子:float a = 5.5;
1、转成二进制:5.5 =
101.1 (整数部分的数字直接转成二进制,小数部分1——>0.5X2=1.0 , 小数部分正好等于0,停止转换)
2、 符号位S为0 ;
2、 符号位S为0 ;
3、
指数E为2(这个2是101.1转成科学记数法1.011,向左移动了
2位);
4、
指数E偏移
:float类型,指数偏移127,即↓;
5、
指数E转成二进制 ,2+127=129——>129转成二进制为10000001;
6、
尾数位M:1.011 的 011 00000000000000000000(尾数M占23位不够补0)
因此,float类型在内存中存储二进制形式为:
0 10000001 011 0000 0000 0000 0000 0000
double 类型,符号位占1位,指数位占11位,偏移量为1023,尾数位占52位。
例如,对于浮点数 3.125 ,转换为二进制是 11.001 ,即 1.1001×2^1 。符号位为0,指数为1,存储的指数值为1 + 127 = 128,即二进制的10000000,尾数位为1001后面补19个0。所以在内存中存储的二进制形式为 0 10000000 10010000000000000000000 。
E在内存中取出分为三种情况:
1、E不全为0 或 E不全为1
当指数E处于00000001到11111110之间,5.5在内存中按正常规格化数处理,先将存储的二进制位按符号位、指数位、尾数位解析,通过公式(-1)^S x 1.M x 2^E
-127计算出值,再取出。
2、E全为0
E=1-126 或者 E=1-1023(1023是double的E,E有11位)
有效数字
M
不再加上第一位的
1
,而是还原为
0.xxxxxx
的小数。这样做是为了表示
±0
,以及接近于
0
的很小的数字。
3、全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)