整数存储
整数在内存中是以二进制序列直接进行存储的,而对于有符号和无符号的整数的存储方式是不同的。
无符号整数
这里比较简单,就是将整数直接转化为二进制序列,32位机器是32个二进制数,64位机器是64个二进制数,这个转化使用除2取余法可以轻松做到。
例:465存储在32位机器的内存中是00000000 00000000 00000001 11010001
有符号整数
有符号的整数自然要留出符号的位置,在每个二进制序列的第一位为符号位。
这里引入原码 反码 补码的名称,用来描述负整数的存储。
原码:是整数直接转化为的二进制序列。
反码: 符号位不变,之后是原码中的数字0变为1,1变为0后得到的二进制序列。
补码:是反码的二进制序列加1,是计算机真正在内存中存储的二进制序列。
正整数的原反补码都相同。 负整数需要进行变换。这里的负号用1来表示。
例:-465的原码为 10000000 00000000 00000001 11010001
反码为 11111111 11111111 11111110 00101110
补码为 11111111 11111111 11111110 00101111
浮点数存储
浮点数在内存中根据IEEE754标准进行存储,形式为:(-1)^ s * M * 2^E,是先转化为二进制序列,再经过变换存储。
在这里s为0或1,用来存储正负号,M是一个属于大于等于1而小于2的数,2^E就是相当于十进制中的10^E,是二进制的科学计数法。
例:5.5 -》101.1-》(-1)^ 0 * 1.011 * 2^2
在不同位数的机器中,浮点数的存储略有差别,
32位中1位是符号位存s,接下来的8位是存(E+127)的值,余下的位存M(在存时将1去掉,仅留下小数点后的数字,能多存一位,取时将1加上。)
64位机器中1位为符号位存s,接下来的11位存(E+1023)的值,余下的位存M(依旧是存时将1去掉,仅留下小数点后的数字,能多存一位,取时将1加上。)
注意
为了存储更加精准,E的存储分情况。
1 E全为零时,相当于2^-127,此时取出这个浮点数不会加上1直接为0. ……,
2 E全为1且M全为0时,相当于2^128,如果s为0,那么这个数表示无穷大,如果s为1,则表示负无穷大,E全为1且M不全为0是,表示某些无效的数,返回NaN为结果。