文章目录
一、整形在内存中的存储
整形在内存中存储分为有符号和无符号,即signed int有符号整数,unsigned int无符号整数,int 在VS中是默认有符号的。
1、无符号整数。
存储无符号整数时,把整数转换为二进制的形式存储在内存中,当使用时直接取出来使用。
2、有符号整数。
在有符号整数中,把最高位当作符号位,0表示正数,1表示负数。
在存储时有符号整数引入了原码,反码,补码的概念。
正整数的原、反、补码都相同。
负整数的三种表示方法各不同。
原码:直接将负数最高位为1,值翻译成二进制形式。
反码:将原码除符号位外,按位取反。
补码:反码+1得到补码。
对于整形来说:数据存放内存中其实存放的是补码。
在计算机系统中,数值⼀律⽤补码来表⽰和存储。
原因在于,使⽤补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是
相同的,不需要额外的硬件电路。
二、大小端字节序
计算机在内存中存储的数据分为大端存储和小端存储。
大端存储:数据的高字节内容保存在内存的低地址处,数据的低字节内容保存在高地址处。
小端存储:数据的高字节内容保存在内存的高地址处,数据的低字节内容保存在低地址处。
判断当前编译器是大小端字节序方法
c
#include<stdio.h>
int judge_the_size()
{
int a = 1;
return *((char*)&a);
}
int main()
{
if (judge_the_size())
{
printf("小端字节序\n");
}
else
{
printf("大端字节序\n");
}
return 0;
}

三、练习
练习1:
c
#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;
}
char类型的取值范围为-128~127
a 和 b 在取值范围内类型相同,结果都为-1
c类型为无符号char类型,取值范围为0~255
-1给unsigned char 赋值
-1在内存中的存储补码为1111111
用%d打印时整形提升补0
结果255

练习2:
c
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
char类型存储-128
在内存中的补码为1000000
在用%u打印整形提升时补1
11111111 11111111 11111111 10000000
结果为这个二进制的值
四、浮点数在内存中的存储
1、浮点数的存储
浮点数家族包括: float、double、long double 类型。
V = (−1) S * M ∗ 2E
• (−1) s表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M表⽰有效数字,M是⼤于等于1,⼩于2的
• 2 表⽰指数位
对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最高的1位存储符号位S,接着11位存储指数E,剩下的52位存储有效数字M
2、浮点数存的过程
在存时会把M转换成大于等于1,小于2的小数,移动小数位所以称为浮点数,对应E的值改变,存储M时只存储小数点后的数。
对指数E存储时E位8位时,加上中间值127然后存入内存中。
在E为11位时,加上中间值1023。
3、浮点数取的过程
分为三种情况:
(1)E不全为0或全为1
这时浮点是取的过程M加1,E如果在存时+127,取时就-127.
怎么存就反着取出来
(2)E全为0
这时,浮点数指数E的真实值等于1-127(或者1-1023),有效数M不再加1,直接还原为0.xxxxxxx的小数,这样为了表示±0,以及接近于0的很小的数字。
(3)E全为1
如果有效数M全为0,表示±无穷大