关于字符串转浮点型的一些思考

float – 单精度,占用4个字节的空间。

char – 字符型,占用1个字符的空间。

一个float可转换为4个char型表示。

第一种方法,最简单的方法:

union float_type
{
       float f;
       char s[4];
};

注意数据存储的方向性(即大小端问题)。

例如:

在小端上: 浮点数3.750000表示为 0x40980000

则s[3] =0x40; s[2] = 0x98; s[1] = s[0] = 0; 然后 f = 3.750000

在大端上反之

问题至此结束,没有任何问题,然而个人比较贱,喜欢装B,加上看过一些浮点表示法的书籍,对使用IEEE 754方法来转换跃跃欲试,那么问题来了。

跟据格式编写代码如下:

voidchar2float(char *s, float *f)
{
        int flag, exp;
       flag = (s[0] & 0x80) ? (-1) : 1;
       exp = ((s[0] & 0x7f) << 1) + (1 & (s[1] >> 7))– 127;
       *f = (float) ( flag * 1.0 * ( (1 <<23) + ((s[1] & 0x7f) <<16) + (s[2] << 8) + s[3]
        ) / (1 <<(23 - exp)));
}

运行,得出0x40980000就是3.750000

哈哈,可是当输入0x00000000后,有点不对劲啊,怎么输出2.000000呢?

不妙啊,看我的凌波微步,各种飘移。怎么会错呢?

后来,我终于明白了,如何去。。。

左看看右看看,只能出现在(1 << (23 - exp))上了,当我换上pow(2.0, 23-exp)后问题就好了。

然后我就百度一下移位运算符:

在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动 的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是 移动66次和移动2次得到的结果相同。

所以(1<< 23) / (1 << 150) = (1<<23)/(1<<22) = 2.000000

那么问题解决了吗?

时间: 2024-12-12 23:10:35

关于字符串转浮点型的一些思考的相关文章

对于弱类型语言,譬如PHP,其字符串转为浮点型

弱类型语言,php,javascript,将字符串转为浮点型都可以这样做: $str = "45.3"; $str = float($str); 也可以直接在加上0, $str = $str + 0; 此时$str已经是一个浮点型了,当然结果可能小数位数很多,可以 $str = round($str,2);保留2位小数.

Tcl学习之--字符串

[字符串操作] Tcl的精髓在于对字符串的处理,很多函数非常有用,特别是正则表达式.下面列出其常用的函数. l sting index:  --> 索引 l sting range:  --> 范围 l sting length: --> 长度 l sting toupper 和string tolower: --> 大小写 l sting trim. trimleft, trimright:   --> 剪裁 三种剪裁方式,每种方式都需要两个参数:指定字符串,指定裁剪方式.

字符串 到浮点数 整数 又到浮点数

sprintf  比较好用 float  2  char 用sprintf() 就可以了: 例如,float,double 到 char #include<stdio.h> #include<stdlib.h> void main() { float f= 1234.5; double d= 789.8765; char sf[20],sd[20]; sprintf(sf,"%f",f); // float 到 char sprintf(sd,"%lf

PHP 字符串的隐式转换规则以及针对包含字母的字符串的递增/递减操作

之前一直对 PHP 中关于字符串的算数运算隐式类型转换规则和递增/递减操作符针对字符串的操作比较模糊,今天总结一下. 一.隐式转换 二进制算术运算符的隐式类型转换规则(http://php.net/manual/zh/language.types.string.php) 第一个操作数类型 第二个操作数类型 类型转换 整型 浮点型 整型转换为浮点型 整型 字符串 字符串转换为数字,如果字符串转换后是浮点型,整型也会转换为浮点型 浮点型 字符串 字符串转换为浮点型 总结一下就是浮点型 > 整型 >

Python 字符串、列表、元组、索引、切片

一.简要概述 what is list? 1.用[ 和 ]括起来,用逗号间隔每个数据项 2.数据项可是同类型数据也可以是不同类型数据(数字.字符串.浮点型) 3.list里面可以有list作为其数据项 4.数据项对应的位置为索引编号(index).默认第一个是0 5.有序的数据集合 what is string? 1.用单引号.双引号.三引号引起来. 2.字符串是一个常量不可被修改,它的主要用途就是读其元素. what is tuple? 1.元组和字符串均是不可被修改的.但是访问的方式都是一样

js中字符串转换为数值的两种方法的区别

在js中字符串转换为数值的方法有三种:转换函数,强制类型转换,隐式转换 1.转换函数 parseInt()   //将字符串转换为整型 parseFloat()  //将字符串转换为浮点型 转换函数在进行类型转换时是可以传入参数的,默认转换为10进制,转换成功后返回的是整数类型的数值. 例:1. parseInt('AB3', 16) //返回结果:2739,表示将字符串转换为16进制的数值 2.parseInt('13', 10) //返回结果:13,表示将字符串转换为10进制的数值 3.pa

ios NSString字符串如何转为NSNumber(已解决)

今天同事问我 NSString字符串如何转为NSNumber,思考了一下解决了 思路:先将字符串转为NSInteger类型,再通过NSNumber的创建方法@(数字)即可实现 NSString * str = @"890909"; // 字符串转为NSInteger类型 NSInteger num = [str integerValue]; NSLog(@"%li",num); // 字符串转为NSNumber对象类型 NSNumber * nums = @(num

Python(四)字符串

转义符号 \n   代表换行符 \t    代表tab符 \"    代表双引号本身 \'     代表单引号本身 >>> print "sunny,"ok""  File "<stdin>", line 1    print "sunny,"ok""                   ^SyntaxError: invalid syntax>>>

字符串转整形

1.c_str()的用法: C中没有string,所以函数c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址. char *p=s[10]; string a="welcome"; strcpy(p,a.c_str()); cout<<p; 2.字符串转整型: 1. int cnt=0; while(s[i]>='0'&&s[i]<='9') cnt=cnt*10+