[英]Why Isn't My Floating Point Values Printing Properly?
我正在嘗試打印浮點值0x40a00000和0xc0200000。 但是,根據IEEE-754浮點轉換器( https://www.h-schmidt.net/FloatConverter/IEEE754.html ),我打印出的值和正確值完全不同:
我應該根據IEEE轉換器獲得的值:
0x3F800000 = 5.00
0xBF000000 = -2.50
我在運行時得到的值:
float tmp1 = 0x40a00000;
float tmp2 = 0xc0200000;
printf("tmp1 = %.2f\n", tmp1);
printf("tmp2 = %.2f\n", tmp2);
是
tmp1 = 1084227584.00
tmp2 = 3223322624.00
由於某種原因,我的C代碼沒有按照IEEE標准格式化浮點值的位,而是將它們格式化為好像是帶小數點的int
這些將十六進制數字的浮點數表示形式分配給浮點數。
相反,請執行以下操作:
int i1 = 0x40a00000;
int i2 = 0xc0200000;
float tmp1, tmp2;
memcpy(&tmp1, &i1, sizeof(int));
memcpy(&tmp2, &i2, sizeof(int));
打印它們:
printf("tmp1 = %.2f\n", tmp1);
printf("tmp2 = %.2f\n", tmp2);
輸出:
tmp1 = 5.00
tmp2 = -2.50
完整示例:
#include <stdio.h>
#include <string.h>
int main(void)
{
int i1 = 0x40a00000;
int i2 = 0xc0200000;
float tmp1, tmp2;
memcpy(&tmp1, &i1, sizeof(int));
memcpy(&tmp2, &i2, sizeof(int));
printf("tmp1 = %.2f\n", tmp1);
printf("tmp2 = %.2f\n", tmp2);
}
這些沒有按照您認為的去做:
float tmp1 = 0x40a00000;
float tmp2 = 0xc0200000;
您只需使用要打印的十進制整數的十六進制表示形式即可; 它們不會將這些字節推入,因此可以將它們解釋為浮點數。
聽起來您想要做的是(以某種方式)在某個地方獲取想要的字節,獲取其地址,並將其強制轉換為指向浮點數的指針,在取消引用時將其解釋為浮點數。
union
{
int i;
float f;
}k1,k2;
k1.i = 0x40a00000;
k2.i = 0xc0200000;
printf("f1 = %.2f\n", k1.f);
printf("f2 = %.2f\n", k2.f);
int i1 = 0x40a00000;
int i2 = 0xc0200000;
float f1 = *(float*)&i1;
float f2 = *(float*)&i2;
printf("f1 = %.2f\n", f1);
printf("f2 = %.2f\n", f2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.