3

我正在使用一个函数(从:http ://www.exploringbinary.com/converting-floating-point-numbers-to-binary-strings-in-c/ 借用代码)将浮点数转换为二进制数;存储在一个字符中。我需要能够对结果执行按位运算,所以我一直在尝试找到一种方法来获取字符串并将其转换为整数,以便我可以根据需要移动位。我试过 atoi() 但这似乎返回-1。

到目前为止,我有:

char binStringRaw[FP2BIN_STRING_MAX];
float myfloat;

printf("Enter a floating point number: ");
scanf("%f", &myfloat);
int castedFloat = (*((int*)&myfloat));
fp2bin(castedFloat, binStringRaw);

当输入为“12.125”时,binStringRaw 的输出为“10000010100001000000000000000000”。但是,尝试对此执行按位运算会报错:“二进制表达式的操作数无效('char[1077]' 和 'int')”。

PS - 如果这是一个简单的问题,或者我的代码存在一些一般性问题,我深表歉意。我对来自 Python 的 C 编程非常陌生。

4

1 回答 1

2

“castedFloat 已经是浮点数的二进制表示,因为投射操作告诉它将 myfloat 的位解释为整数位而不是浮点数。”

编辑:感谢Eric Postpischil

Eric Postpischil 在评论中:“C 标准不保证上述内容。标准没有完全指定取消引用转换的指针。正确的方法是使用联合:int x = (union { float f; int i; }) { myfloat } .i;。(并且仍然必须确保 int 和float 在使用的​​ C 实现中是相同的大小。)"

位运算仅针对整数类型的值定义,例如 char、int、long、...,这就是为什么在字符串(char-array)上使用它们时会失败的原因

顺便提一句,

int atoi(char*)

返回写入该字符串中的数字的整数值,例如。

atoi("12")

将返回一个值为 12 的整数

如果要转换存储在字符串中的二进制表示,则必须逐位设置与字符对应的整数,执行此操作的函数可能如下所示:

long intFromBinString(char* str){
   long ret=0;          //initialize returnvalue with zero
   int i=0;             //stores the current position in string
   while(str[i] != 0){  //in c, strings are NULL-terminated, so end of string is 0
      ret<<1;           //another bit in string, so binary shift resutl-value 
      if(str[i] == '1') //if the new bit was 1, add that by binary or at the end
         ret || 0x01;
      i++;              //increment position in string
   }
   return ret;          //return result
}

函数 fp2bin 需要获取一个 double 作为参数。如果你用 castedFloat 调用它,(现在解释为整数)值将被隐式转换为 float,然后将其传递。

我假设您想获得浮点数的二进制表示,对其进行一些按位操作,然后将其传递。为了做到这一点,你必须把它放回浮动,你以前做的相反的方式,所以

int castedFloat = (*((int*)&myfloat));
{/*** some bitwise magic ***/}
float backcastedFloat = (*(float*)&castedFloat);
fp2bin(castedFloat, binStringRaw);

编辑:(再次感谢,埃里克):

union bothType { float f; int i; }) both;
both.f = myfloat;
{/*** some bitwise magic on both.i ***/}
fp2bin(both.f, binStringRaw);

应该管用

于 2013-03-03T22:37:11.867 回答