假设楼主不是来钓鱼的吧。。
浮点数一般是按 IEEE 754 二进制来表示的,没有什么补码的概念,正负就是最高位的 1bit 。
至于将字符串解析为 IEEE 754 二进制,不用说手写了,用代码转换都复杂得很,java 、php 、glibc 甚至编译器都有过各种 bug:
https://www.exploringbinary.com/topics/#correctly-rounded-decimal-to-floating-point想了解的话可以看一下这个算法:
https://www.ampl.com/netlib/fp/dtoa.c 苹果的 iOS macOS 用的就是这份代码。
具体到 1.234 这个数,如果用手算的话,就是 1234 / 1000,转换为二进制,再进行大整数计算,得到的是一个无限长度的二进制小数:
1.001110111110011101101100100010110100001110010101100000010000011000100100110111010010111100011010100111111011111001110110...
这里 54 bit 是 0,则向下舍入,得到二进制:
1.0011101111100111011011001000101101000011100101011
转换为 IEEE 754 表示,最高位 1 表示负数,后面 11 位是 exp 0,加上 1023 bias 就是 01111111111,
最后 52 位就是上面的二进制,隐藏高位 1,合起来就是:
1 01111111111 0011101111100111011011001000101101000011100101011000
用 hex 表示就是
0xbff3be76c8b43958
我们可以再实际验证一下:
uint64_t p = 0xbff3be76c8b43958ull;
double d = *(double *)&p;
printf("%.17g\n", d);