目录
整数在内存中的储存
储存的是二进制
1.二进制三种表现方法--原码、反码、补码
- 有符号位的整数,三种表示方法均有符号位和数值位这两部分
- 其中符号位为最高位,0表示正数,1表示负数,剩下的就是数值位
1.正整数的原、反、补码都相同
2.负整数的原、反、补码各不相同
原码:将数值按照正负数的形式翻译成二进制
反码:原码除符号位,按位取反
补码:反码+1,也可以是原码 除符号位按位取反+1
也可以通过补码得到原码,补码取反+1得到原码
正整数:5
原码:00000000000000000000000000000101
反码:00000000000000000000000000000101
补码:00000000000000000000000000000101
负整数:-5
原码:10000000000000000000000000000101
反码:11111111111111111111111111111010
补码:11111111111111111111111111111011
2.在内存中存放的是补码
- 为什么存放的是补码
使用补码存放更加方便,可以将符号和数值域统一处理
大小端字节和字节序判断
1.大小端字节
大端字节序储存:把一个数据的低字节位的内容储存到高地址处,把数据的高字节位的内容储存到低地址处
小端字节序储存:把一个数据的低字节位的内容储存到低地址处,把数据的高字节位的内容储存到高地址处
字节序判断
#include<stdio.h>
int zj()
{
int n = 1;
//0x00 00 00 01
if (*(char*)&n == 1)
{
return 1;
//小端储存:01 00 00 00
}
else
{
return 0;
//大端储存:00 00 00 01
}
}
int main()
{
int ret=zj();
if(ret==1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
整数在内存中的存储范围
char类型为一个字节,以char类型为例;
有符号整形signed char取值范围:-128~127;
无符号整形unsigned char 取值范围:0~255;
浮点数在内存中的储存
浮点数的存储
浮点数的表示方式:
V:(-1)^s*M*2^E
例:3.5二进制表示(-1)^0*1.11*2^1
s=0,M=1.11,E=1
- (-1)^s:表示符号位,当s=0时,V为正数,当s=1时,V为负数;
- M :表示有效数字,取值范围为1<=M<2;
- 2^E:表示指数位
浮点数的储存就是与S、M、E相关的值 E754
IEEE754规定
- 对于32位浮点数(float):最高的一位存储的符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
- 对于64位浮点数(double):最高的一位存储的符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
E是无符号整形
- E为8位时,取值范围为0~255;
- E为11位时,取值范围为0~2047;
- 但在科学计数法中,E可以是负数,所以要加上一个中间值,8位的中间值为127,11位的中间值为1023
浮点数读取的过程
- E不全为0或不全为1时:指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位1;
- E全为0时:指数E等于1-127(或1-1023),即为真实值,有效数字不再加上第一位的1,表示正负0,以及接近于0很小的数字(正负取决于S);
- E全为1时:如果数字M全为0,表示正负无穷大(正负取决于S)。