面试题:计算机内部如何存储负数和浮点数?
在计算机内部,负数和浮点数的存储方式与整数不同,需要使用特殊的编码方式进行存储和处理。
负数的存储
计算机中通常使用补码来表示负数。在补码表示法中,对于一个有符号的n位二进制数,将其转为负数时,先将该数取反(每一位0变成1,1 变成0),然后再加 1。
例如,假设我们要将十进制数 -5 表示为8位二进制补码,以下是转换的过程:
- 将5转化为二进制数:00000101
- 取反得到:11111010
- 加 1 得到:11111011
因此,8位二进制补码11111011表示的就是十进制数-5。
这种表示方法的好处是,在计算机内部,正数和负数采用相同的编码方式,同时它还可以避免在反码和原码之间进行转换时产生的溢出问题。但是,需要注意最高位是符号位,所以在进行数值运算时需要特别考虑符号位的影响。
浮点数的存储
计算机中通常使用IEEE 754标准来表示浮点数。在IEEE 754标准中,浮点数由三部分组成:符号位、指数和尾数。其中符号位用于表示正数或负数,指数和尾数则用于表示浮点数的大小和精度。
例如,下面是32位IEEE 754单精度浮点数的存储结构:
符号位 | 指数 | 尾数 |
1位 | 8位 | 23位 |
在这种存储方式中,符号位为0表示正数,为1表示负数;指数采用移码表示(将真实值加上一个偏移量,保证指数在存储时都为正数),用于调整浮点数的大小,尾数则用于表示浮点数的精度。
例如,以下二进制数01000000101000000000000000000000表示的就是十进制数 2.5:
- 符号位:0,表示正数。
- 指数:10000001(2的8次方为256,减去偏移量127后为129),表示2^1。
- 尾数:01000000000000000000000(二进制小数,即0.5),表示1.5。
因此,在计算机内部存储浮点数时需要分别存储符号位、指数和尾数,并同时考虑科学计数法和二进制转换规则等问题。
综上所述,计算机内部通常采用补码和IEEE 754标准来表示负数和浮点数,这些编码方式都需要考虑符号位、指数和尾数等因素,并对数据进行转换以保证正确性和精度。