赞
踩
ieee754,要求如下,
定义函数 int my_int_float()
从键盘输入一个单精度浮点数的字符串,然后自己解析该字符串,并用位操作把对应的值按754格式保存到4字节里,最后返回该四字节对应的整数值,期间不能使用 float 和 double类型。
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<math.h>
-
- /*
- !!!!!!!
- 说明: 将单精度浮点数的IEEE754转换成32位整型时,最高位为符号位
- */
-
- int int_binary[24]; //整数部分二进制表示
- int decimal_binary[24]; //小数部分二进制表示
- int res[32]; //ieee754格式
-
- int my_int_float(char *s);
- void binary_int(int a, int *ans, int start, int end);
- void binary_decimal(char *s, int a_int, int* ans, int start, int end);
-
- int main() {
- char* s = "-18.125";
- printf("%s 的IEEE754格式转化位整数位 :%d\n", s, my_int_float(s));
- }
-
- int my_int_float(char *s) {
- memset(int_binary, 0, 24);
- memset(decimal_binary, 0, 24);
- memset(res, 0, 32);
- int a_int = abs(atoi(s)); //记录整数部分
- int i;
- //记录数符
- if(atof(s) > 0) {
- res[0] = 0;
- } else if(atof(s) < 0){
- res[0] = 1;
- } else {
- return 0; //若输入的单精度浮点数位0,则其IEEE754对应的整数为0
- }
-
- //记录移码
- int record = 0;
- binary_int(a_int, int_binary, 0, 23); //将单精度浮点数的整数部分转化成二进制
- if(a_int != 0) {
- for(i = 23; i >= 0; i--) {
- if(int_binary[i] == 1){
- record = i;
- break;
- }
- }
- } else {
- for(i = 0; i < 24; i++) {
- if(decimal_binary[i] == 1) {
- record = -(i + 1);
- }
- }
- }
-
- int e = record + 127; //阶码的十进制
- binary_int(e, res, 8, 1);
- //记录尾码
- int surplus;
- for(i = 23; i >= 0; i--){
- if(int_binary[i] == 1) {
- surplus = 23 - i;
- break;
- }
- }
- binary_decimal(s, a_int, decimal_binary, 0, surplus); //将单精度浮点数的小数部分转化成 二进制
- int pc = 9;
- for(i -= 1; i >= 0 && pc < 32; i--) {
- res[pc++] = int_binary[i];
- }
- for(i = 0; i < 24 && pc < 32; i++){
- res[pc++] = decimal_binary[i];
- }
- //求对应整数
-
- int num = 0;
- for(i = 31; i > 0; i--) {
- num += res[i] * (int)pow(2, 31 - i);
- }
-
- if(res[0] == 0) { //将最高位看作符号位,不计入有效位
- return num;
- } else {
- return -num;
- }
- }
-
- void binary_int(int a, int *ans, int start, int end) { //将整数a的二进制保存ans的start到end内
- int i = start;
- if(start < end) { //二进制反向序列
- while(a > 0 && i <= end) {
- ans[i++] = a % 2;
- a /= 2;
- }
- } else { //二进制正向序列
- while(a > 0 && i >= end) {
- ans[i--] = a % 2;
- a /= 2;
- }
- }
-
- }
-
- void binary_decimal(char *s, int a_int, int* ans, int start, int end) { //求输入的单精度浮点数的小数部分的二进制
- int x = 0,y = 2, i;
- for(i = start; i < end; i++) {
- decimal_binary[i] = (int)((fabs(atof(s)) - a_int) * y - x);
- if((fabs(atof(s)) - a_int) * y - x == 1) { //乘基后小数恰好为0
- break;
- }
- if(decimal_binary[i] == 1) {
- x++;
- }
- y *= 2;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。