IEEE的单精度浮点数标准
[高位] ------------------------> [低位]
[*][********][***********************]
↑
1符号位 ↑
8位指数 ↑
23位尾数(基数是【1.<尾数>】)
比如:
Float Value:0.75
IEEE Memory:0-01111110-10000000000000000000000
符号位是:正数,
指数部分是:01111110,即126,根据指数的规则-127~128,0在中间.与char不同。
也就是01111111代表数字0。 01111110就是-1(126-127=-1)
基数就是1.100000000
二进制值就是:1.1 * 2^-1 = 0.11
十进制表示就是:2^-1 + 2^-2 = 0.5 + 0.25 = 0.75
代码如下:
#include <iostream>
int main()
{
while (true) {
std::cout << "Input float:" << std::endl;
float v;
std::cin >> v;
std::cout << std::endl;
std::cout << "----------------------------------------------" << std::endl;
std::cout << "Float Value:" << v << "\n";
std::cout << "IEEE Memory:";
// IEEE的单精度浮点数标准
// [高位] ------------------------> [低位]
// [*][********][***********************]
// ↑
// 1符号位 ↑
// 8位指数 ↑
// 23位尾数(基数是【1.<尾数>】)
// 比如:
// Float Value:0.75
// IEEE Memory:0-01111110-10000000000000000000000
// 符号位是:正数,
// 指数部分是:01111110,即126,根据指数的规则-127~128,0在中间.与char不同。
// 也就是01111111代表数字0。 01111110就是-1(126-127=-1)
// 基数就是1.100000000
// 二进制值就是:1.1 * 2^-1 = 0.11
// 十进制表示就是:2^-1 + 2^-2 = 0.5 + 0.25 = 0.75
uint32_t mem = *((uint32_t*)&v);
uint32_t mask = 0x80000000; // 最高位是1
for(int i=0; i< 32; i++){
std::cout << ( (mask & mem) > 0 ? "1" : "0" );
if(i==0){
std::cout << "-"; // 符号位与值分开
}else if(i==8){
std::cout << "-"; // 指数与尾数分开
}
mask = mask >> 1; // 逻辑右移一位
}
std::cout << std::endl;
std::cout << "----------------------------------------------" << std::endl;
}
return 0;
}