我正在尝试将开发板与覆盆子连接。 我必须通过modbus来将值读/写到板上,但是不能像板一样写浮点值。
我正在使用C和Eclipse调试透视图来直接查看变量的值。 董事会寄给我0x46C35000至12月应该值25'000,但日食显示我1.18720512e + 009 ...
当我在该网站http://www.binaryconvert.com/convert_float.html?hexadecimal=46C35000上尝试时,我获得了25,000。
出什么问题了? 为了测试目的,我使用了这个:
int main(){
while(1){ // To view easily the value in the debug perspective
float test = 0x46C35000;
printf("%f\n",test);
}
return 0;
}
谢谢!
答案 0 :(得分:6)
执行此操作时:
float test = 0x46C35000;
您将值设置为0x46C35000(十进制1187205120),而不是表示形式。
您可以执行以下操作:
union {
uint32_t i;
float f;
} u = { 0x46C35000 };
printf("f=%f\n", u.f);
这可以安全地将无符号的32位值解释为float
。
答案 1 :(得分:4)
您混淆了逻辑值和内部表示。您的分配设置了值,此后为0x46C35000,即1187205120。
要设置浮点数的内部表示,您需要对如何在内存中表示浮点数做出一些假设。不过,在通用计算机上,您正在使用的网站(IEEE 754,32位)上的假设是合理的。
要更改内部表示,请使用memcpy
将原始字节复制到浮点数中:
// Ensure our assumptions are correct:
#if !defined(__STDC_IEC_559__) && !defined(__GCC_IEC_559)
# error Floating points might not be in IEEE 754/IEC 559 format!
#endif
_Static_assert(sizeof(float) == sizeof(uint32_t), "Floats are not 32 bit numbers");
float f;
uint32_t rep = 0x46C35000;
memcpy(&f, &rep, sizeof f);
printf("%f\n", f);
输出:25000.000000
。
(这需要stdint.h
的标头uint32_t
和string.h
的标头memcpy
。)
答案 2 :(得分:3)
分配给0x46C35000
的常量float
会将int
的值1187205120隐式转换为float
,而不是将这些位直接覆盖到IEEE-754浮点数中点格式。
对于这种事情,我通常使用union
:
typedef union xFU
{
float f;
uint32_t i;
} FU;
int main()
{
FU foo;
foo.f = 25000.0;
printf("%.8X\n", foo.i);
foo.i = 0x46C35000;
printf("%f\n", foo.f);
return 0;
}
输出:
46C35000
25000.000000
答案 3 :(得分:0)
通过地址访问数据时,您可以了解它们在内存中的表示方式:
function hiddenrowssummary() {
ss=SpreadsheetApp.getActiveSpreadsheet();
var summary=ss.getSheetByName('Summary');
var originaldata=summary.getRange(1,1,summary.getLastRow()-1,summary.getLastColumn()).getValues();
var filtervalues= originaldata.filter(filterlogic);
Logger.log(filtervalues);
}
var filterlogic= function(item){
return item[4]==="TRUE";
}
和结果:
#include <stdio.h>
int main()
{
float f25000; // totally unused, has exactly same size as `int'
int i = 0x46C35000; // put binary value of 0x46C35000 into `int' (4 bytes representation of integer)
float *faddr; // pointer (address) to float
faddr = (float*)&i; // put address of `i' into `faddr' so `faddr' points to `i' in memory
printf("f=%f\n", *faddr); // print value pointed bu `faddr'
return 0;
}
它的作用是:
将$ gcc -of25000 f25000.c; ./f25000
f=25000.000000
放入整型0x46C35000
将i
的地址复制到i
,这也是指向内存中数据的地址,在这种情况下为faddr
类型
由float
指向的打印值;将其视为faddr
类型
您得到float
。