我正在使用一个函数(从http://www.exploringbinary.com/converting-floating-point-numbers-to-binary-strings-in-c/借用代码)将float转换为二进制;存储在char中。我需要能够对结果执行按位操作,所以我一直在尝试找到一种方法来获取字符串并将其转换为整数,以便我可以根据需要移动位。我试过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')”。
P.S。 - 如果这是一个简单的问题,或者我的代码存在一些常见问题,我深表歉意。我对来自Python的C编程非常陌生。
答案 0 :(得分:2)
“castedFloat已经是float的二进制表示,因为cast-operation告诉它将myfloat的位解释为整数的位而不是float。”
编辑:感谢Eric Postpischil:
Eric Postpischil评论: “C标准不保证上述内容。取消引用a 转换指针未由标准完全指定。一个正确的方法 这样做是使用联合:
int x = (union { float f; int i; }) { myfloat } .i;
。 (并且必须确保int和float是 在使用的C实现中大小相同。)“
按位运算仅为整数类型值定义,例如char,int,long,...,这就是为什么它在字符串上使用时失败的原因(char-array)
btw,
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,然后将其传递。
我假设你想获得float的二进制表示,在它上面播放一些按位操作,然后传递它。 为了做到这一点,你必须将它转回浮动,这与你之前做的相反,所以
int castedFloat = (*((int*)&myfloat));
{/*** some bitwise magic ***/}
float backcastedFloat = (*(float*)&castedFloat);
fp2bin(castedFloat, binStringRaw);
编辑:(再次感谢,Eric):
union bothType { float f; int i; }) both;
both.f = myfloat;
{/*** some bitwise magic on both.i ***/}
fp2bin(both.f, binStringRaw);
应该有效