2014-09-24 251 views
1

我正在处理从一个平台到另一个浮点数的32位浮点数。那么它只允许将16位unsinged int成员传递给transfter寄存器。我在想,我可以将32位浮点数分成两个16位,然后再转换到另一侧的32位。将一个32位浮点数转换为两个16位浮点数,然后再转换回该32位浮点数

(我用C语言)

喜欢:

float A = 3.14 
uint16_t B = A & 0xffff; 
uint16_t C = A & 0xffff0000; 

float D = C<<16 & B; 

Obevious这是不正确的当它被分配的浮点数据将被转换为无符号整型。那我通常怎么做呢?应当有一些比较成熟的方法来做similiar事情

感谢

+0

只是提一些关键字,如果你想要做一些进一步的研究:这就是所谓的类型 - 打算或重新解释。 – mafso 2014-09-24 11:25:04

回答

5

可以使用工会对于这一点,如:

typedef union { 
    float f; 
    uint16_t a[2]; 
} U; 

U u; 

u.f = 3.14f; 

printf("%g -> %#x %#x\n", u.f, u.a[0], u.a[1]); 

LIVE DEMO

注:严格来说,这是不确定的行为,但这是一种广泛使用的技术,不可能失败。或者你可以采取一个更安全,但可能稍差有效的方法,只是使用memcpy,这样的:

float f = 3.14f; 
uint16_t a[2]; 
memcpy(a, &f, sizeof(a)); 
printf("%g -> %#x %#x\n", f, a[0], a[1]); 

LIVE DEMO

+1

尽管这是常用的,但它是未定义的行为来读取另一个联合成员比写的。 – 2014-09-24 08:52:14

+0

@vlad_tepesch:是的,谢谢,只是给这个答案添加一个关于这个的注释。 – 2014-09-24 08:55:00

+2

也许最好使用中间uint32_t并手动掩盖/合并16位碎片以帮助解决字节顺序差异。毕竟,这个号码正在“平台”之间转移。 – doynax 2014-09-24 09:16:13

相关问题