我正在尝试将数字170.3转换为IEE 754二进制32位浮点数:
您可以从下面的图片中看到我的工作过程:
所以十进制数170在二进制中表示为10101010。
我们可以看到,模式1001将永远重复,所以我们有类似的情况
0.3 = 0.01001,其中粗体部分是循环的。
将这些数字放在一起时,我们可以得到整个值的二进制表示:
170.3 = 10101010.01001,其中粗体部分是循环的。
将其转换为标准形式。
当被分成4个字节时,应该是:
我接着尝试运行这个C++程序,它存储了浮点数并打印出内存内容。
但是在输出中,我看到最后一位是1而不是根据我的计算是0。
而且,当使用在线转换器时,最后一位也变成了1。
请问有人可以解释一下我在计算中哪里出错了吗?
您可以从下面的图片中看到我的工作过程:
将170转换为二进制
![170 into Binary Working](https://istack.dev59.com/aQlQ8.webp)
将0.3转化为二进制
![0.3 into Binary Working](https://istack.dev59.com/p9zXY.webp)
0.3 = 0.01001,其中粗体部分是循环的。
将这些数字放在一起时,我们可以得到整个值的二进制表示:
170.3 = 10101010.01001,其中粗体部分是循环的。
将其转换为标准形式。
![Conversion to Base 2 Standard Form Working](https://istack.dev59.com/WSvCI.webp)
170.3 = 1.010101001001 x 2⁷
存储方式:
以下是我们分配的 4 字节(32 位)的方式:
- 符号位为 0,因为我们处理的是正数
- 指数位为 127 + 7 = 134,二进制表示为 10000110
- 小数部分由循环小数的前 23 位填充,本例中为 01010100100110011001100(其中粗体部分为循环部分)
因此,我们可以将它们组合在一起,得到要存储到我们的 4 字节(32 位)数据中的二进制数据:
01000011001010100100110011001100
当被分成4个字节时,应该是:
01000011-00101010-01001100-11001100
我接着尝试运行这个C++程序,它存储了浮点数并打印出内存内容。
#include <iostream>
/* Prints Contents of Memory Blocks */
static void print_bytes(const void *object, size_t size){
#ifdef __cplusplus
const unsigned char * const bytes = static_cast<const unsigned char *>(object);
#else // __cplusplus
const unsigned char * const bytes = object;
#endif // __cplusplus
size_t i;
printf("[-");
for(i = 0; i < size; i++)
{
//printf(bytes[i]);
int binary[8];
for(int n = 0; n < 8; n++){
binary[7-n] = (bytes[size -1 - i] >> n) & 1;
}
/* print result */
for(int n = 0; n < 8; n++){
printf("%d", binary[n]);
}
printf("%c", '-');
}
printf("]\n\n");
}
int main () {
std::cout << "\nStoring a Float in Memory";
std::cout << "\n----------------------------\n\n";
float height = 170.3f;
std::cout << "Address is "<< &height << "\n\n";
std::cout << "Size is "<< sizeof(height) << " bytes\n\n";
std::cout << "Value is " << height << "\n\n";
std::cout << "Memory Blocks : \n";
print_bytes(&height, sizeof(height));
return 0;
}
但是在输出中,我看到最后一位是1而不是根据我的计算是0。
![Program Output](https://istack.dev59.com/RFT0G.webp)
![Online Converter](https://istack.dev59.com/K2OBL.webp)