当前位置:   article > 正文

IEEE754:将单精度浮点数的IEEE754格式转换成32位整型_visual studio如何实现将ieee754转换成整形

visual studio如何实现将ieee754转换成整形

ieee754,要求如下,

定义函数 int my_int_float()

从键盘输入一个单精度浮点数的字符串,然后自己解析该字符串,并用位操作把对应的值按754格式保存到4字节里,最后返回该四字节对应的整数值,期间不能使用 float 和 double类型。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. /*
  6. !!!!!!!
  7. 说明: 将单精度浮点数的IEEE754转换成32位整型时,最高位为符号位
  8. */
  9. int int_binary[24]; //整数部分二进制表示
  10. int decimal_binary[24]; //小数部分二进制表示
  11. int res[32]; //ieee754格式
  12. int my_int_float(char *s);
  13. void binary_int(int a, int *ans, int start, int end);
  14. void binary_decimal(char *s, int a_int, int* ans, int start, int end);
  15. int main() {
  16. char* s = "-18.125";
  17. printf("%s 的IEEE754格式转化位整数位 :%d\n", s, my_int_float(s));
  18. }
  19. int my_int_float(char *s) {
  20. memset(int_binary, 0, 24);
  21. memset(decimal_binary, 0, 24);
  22. memset(res, 0, 32);
  23. int a_int = abs(atoi(s)); //记录整数部分
  24. int i;
  25. //记录数符
  26. if(atof(s) > 0) {
  27. res[0] = 0;
  28. } else if(atof(s) < 0){
  29. res[0] = 1;
  30. } else {
  31. return 0; //若输入的单精度浮点数位0,则其IEEE754对应的整数为0
  32. }
  33. //记录移码
  34. int record = 0;
  35. binary_int(a_int, int_binary, 0, 23); //将单精度浮点数的整数部分转化成二进制
  36. if(a_int != 0) {
  37. for(i = 23; i >= 0; i--) {
  38. if(int_binary[i] == 1){
  39. record = i;
  40. break;
  41. }
  42. }
  43. } else {
  44. for(i = 0; i < 24; i++) {
  45. if(decimal_binary[i] == 1) {
  46. record = -(i + 1);
  47. }
  48. }
  49. }
  50. int e = record + 127; //阶码的十进制
  51. binary_int(e, res, 8, 1);
  52. //记录尾码
  53. int surplus;
  54. for(i = 23; i >= 0; i--){
  55. if(int_binary[i] == 1) {
  56. surplus = 23 - i;
  57. break;
  58. }
  59. }
  60. binary_decimal(s, a_int, decimal_binary, 0, surplus); //将单精度浮点数的小数部分转化成 二进制
  61. int pc = 9;
  62. for(i -= 1; i >= 0 && pc < 32; i--) {
  63. res[pc++] = int_binary[i];
  64. }
  65. for(i = 0; i < 24 && pc < 32; i++){
  66. res[pc++] = decimal_binary[i];
  67. }
  68. //求对应整数
  69. int num = 0;
  70. for(i = 31; i > 0; i--) {
  71. num += res[i] * (int)pow(2, 31 - i);
  72. }
  73. if(res[0] == 0) { //将最高位看作符号位,不计入有效位
  74. return num;
  75. } else {
  76. return -num;
  77. }
  78. }
  79. void binary_int(int a, int *ans, int start, int end) { //将整数a的二进制保存ans的startend
  80. int i = start;
  81. if(start < end) { //二进制反向序列
  82. while(a > 0 && i <= end) {
  83. ans[i++] = a % 2;
  84. a /= 2;
  85. }
  86. } else { //二进制正向序列
  87. while(a > 0 && i >= end) {
  88. ans[i--] = a % 2;
  89. a /= 2;
  90. }
  91. }
  92. }
  93. void binary_decimal(char *s, int a_int, int* ans, int start, int end) { //求输入的单精度浮点数的小数部分的二进制
  94. int x = 0,y = 2, i;
  95. for(i = start; i < end; i++) {
  96. decimal_binary[i] = (int)((fabs(atof(s)) - a_int) * y - x);
  97. if((fabs(atof(s)) - a_int) * y - x == 1) { //乘基后小数恰好为0
  98. break;
  99. }
  100. if(decimal_binary[i] == 1) {
  101. x++;
  102. }
  103. y *= 2;
  104. }
  105. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/258395
推荐阅读
相关标签
  

闽ICP备14008679号