1.整数在内存中的存储
整数的2进制表示有原码、反码和补码,但是在内存中的存储是补码。下面我就介绍下原码、反码和补码。
三种表示方法均有符号位和数值位,符号位为最高位,其中“1”表示负,“0”表示正。其余位为数值位。
正整数的原码、反码和补码都是一样的。
负整数的三种表示方法各有不同。
原码:直接将正负整数翻译为2进制的就是原码
反码:原码的符号位不变,其余按位取反
补码:将反码加一变为补码
举例:写出-1的原码、反码和补码
int类型4个字节,32个bit位。
原码:10000000000000000000000000000001
反码:11111111111111111111111111111111110
补码:11111111111111111111111111111111111
2.大小端存储
什么是大小端?
#include<stdio.h>
int main()
{
int a = 0x11223344;
return 0;
}
通常情况下,我们计算机都是小端存储。
3.浮点数在内存中的存储
浮点数的类型有float,double,long double类型。
根据规定,任意一个二进制浮点数V可表示为:
表示符号位。当S=0时,V为正数;S=1时,V为负数。
M表示有效数字。M的取值范围为1<=M<2。
表示指数。
举例:
十进制5.5写成二进制是101.1->科学计数法:1.011*2^2
根据上面的公式可得,S=0,M=1.011,E=2。(如果为-5.5,那么S=1,其余一样)
规定:
对于32位的浮点数,最高位存储符号位S,接着的8位存储指数E,剩下的23位存储有效位M。
对于64位的浮点数,最高位存储符号位S,接着的11位存储指数E,剩下的52位存储有效位M。
对于有效位M:
IEEE 754 规定,在计算机内部保存M时, 默认这个数的第一位总是1,因此可以被舍去,只保存后面的小数部分 。比如1.11,计算机只保留11,等到读取时,再加上1
E为无符号整数,所以E为8位时,取值范围为0-255,E为11位时,取值范围为0-2047。但是科学计数法中可以出现负数,所以规定,必须加上 中间值。对于8位的E,中间数127,对于11位的E,中间数是1023。比如2^10,那E=10,但必须保存为10+127=137,即10001001
对于取值范围,我们取E为8位来讲解
有符号位 无符号位
over~