“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);
应该管用