Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在不更改二进制值的情况下将((DWORD)0xFFFFFFFF)转换为单精度浮点_C_Casting_Rom - Fatal编程技术网

C 在不更改二进制值的情况下将((DWORD)0xFFFFFFFF)转换为单精度浮点

C 在不更改二进制值的情况下将((DWORD)0xFFFFFFFF)转换为单精度浮点,c,casting,rom,C,Casting,Rom,我想将一个单精度浮点编译成flash,格式为0xffffff(统一化flash) 当我尝试(FLOAT32)((UINT32)0xffffff)时,它会在编译过程中转换为浮点(0x0000804F),而不是0xffffff 这适用于文件范围内结构中字段的初始化。当我想到它时,这意味着编译器需要一个FLOAT32文本 我开始怀疑这是否真的可能 [编辑:这适用于初始化文件范围中的结构中的字段]在C中,最好的方法是使用联合。存储到UINT32字段中,然后从float字段中读取 在此完成讨论: 此外,如

我想将一个单精度浮点编译成flash,格式为
0xffffff
(统一化flash)

当我尝试
(FLOAT32)((UINT32)0xffffff)
时,它会在编译过程中转换为浮点
(0x0000804F)
,而不是
0xffffff

这适用于文件范围内结构中字段的初始化。当我想到它时,这意味着编译器需要一个FLOAT32文本

我开始怀疑这是否真的可能


[编辑:这适用于初始化文件范围中的结构中的字段]

在C中,最好的方法是使用
联合。存储到
UINT32
字段中,然后从
float
字段中读取

在此完成讨论:


此外,如果有C99功能可用,则可以使用指定的初始值设定项指定要指定的联合字段。即使您没有C99,也可以确保
union
中的
UINT32
字段是第一个字段,因此默认情况下会分配它

在C语言中,最好的方法是使用
联合体。存储到
UINT32
字段中,然后从
float
字段中读取

在此完成讨论:


此外,如果有C99功能可用,则可以使用指定的初始值设定项指定要指定的联合字段。即使您没有C99,也可以确保
union
中的
UINT32
字段是第一个字段,因此默认情况下会分配它

一种解决方案可能是使用绝对位置。使用您的工具可能实现,也可能不实现

注意:我从来没有这样做过,这里的语法在任何编译器上都可能无效。这只是意图的一个例子

UINT32 const i = 0xFFFFFFFF @ 0x12345678; /* Place i at address 0x12345678 */
extern FLASH32 const f @ 0x12345678;  /* Pretend that f is at the same address */

一种解决方案可能是使用绝对位置。使用您的工具可能实现,也可能不实现

注意:我从来没有这样做过,这里的语法在任何编译器上都可能无效。这只是意图的一个例子

UINT32 const i = 0xFFFFFFFF @ 0x12345678; /* Place i at address 0x12345678 */
extern FLASH32 const f @ 0x12345678;  /* Pretend that f is at the same address */

我认为使用联合,然后对其进行任何类型的强制转换都是可行的:

typedef union _DATA {
    UINT32 AsInteger;
    FLOAT AsFloat;
} DATA;

char* Buffer = malloc(...);
ReadFromFile(Buffer, 1000);

// Casting
// ((DATA*) (Buffer + Offset))->AsFloat
// ((DATA*) (Buffer + Offset))->AsInteger
或者静态地

DATA MyData;
MyData.AsInteger = 0xffffffff;

// C99
DATA MyData = {.AsInteger = 0xffffffff};

// C
DATA MyData = {0xffffffff};

我认为使用联合,然后对其进行任何类型的强制转换都是可行的:

typedef union _DATA {
    UINT32 AsInteger;
    FLOAT AsFloat;
} DATA;

char* Buffer = malloc(...);
ReadFromFile(Buffer, 1000);

// Casting
// ((DATA*) (Buffer + Offset))->AsFloat
// ((DATA*) (Buffer + Offset))->AsInteger
或者静态地

DATA MyData;
MyData.AsInteger = 0xffffffff;

// C99
DATA MyData = {.AsInteger = 0xffffffff};

// C
DATA MyData = {0xffffffff};

根据您在注释中的要求:此处为非块范围(您可以设置全局范围或文件范围):

#包括
#包括
typedef联合{
uint32\u t uint32;
浮动f;
}混叠;
别名a={0xffffffff};
int main(){
printf(“%u%f\n”,a.uint32,a.f);//输出:4294967295-1。#QNAN0
返回0;
}
此外,如果您希望将其放在结构中(您最初的问题),并且仍然需要静态初始化,则可以执行以下操作:

#include <inttypes.h>
#include <stdio.h>
typedef union {
    uint32_t uint32;
    float f;
} aliasing;
typedef struct {
    aliasing a;
    int otherstuff;
} thestruct_t;
thestruct_t thestruct = { { 0xffffffff }, 0 };
int main(){
    printf("%u %f\n", thestruct.a.uint32, thestruct.a.f); 
         // output: 4294967295 -1.#QNAN0
    return 0;
}
#包括
#包括
typedef联合{
uint32\u t uint32;
浮动f;
}混叠;
类型定义结构{
给a取别名;
其他东西;
}结构;
结构=结构{{0xffffffff},0};
int main(){
printf(“%u%f\n”,结构a.uint32,结构a.f);
//输出:4294967295-1.#QNAN0
返回0;
}

根据您在注释中的要求:此处为非块范围(您可以设置全局范围或文件范围):

#包括
#包括
typedef联合{
uint32\u t uint32;
浮动f;
}混叠;
别名a={0xffffffff};
int main(){
printf(“%u%f\n”,a.uint32,a.f);//输出:4294967295-1。#QNAN0
返回0;
}
此外,如果您希望将其放在结构中(您最初的问题),并且仍然需要静态初始化,则可以执行以下操作:

#include <inttypes.h>
#include <stdio.h>
typedef union {
    uint32_t uint32;
    float f;
} aliasing;
typedef struct {
    aliasing a;
    int otherstuff;
} thestruct_t;
thestruct_t thestruct = { { 0xffffffff }, 0 };
int main(){
    printf("%u %f\n", thestruct.a.uint32, thestruct.a.f); 
         // output: 4294967295 -1.#QNAN0
    return 0;
}
#包括
#包括
typedef联合{
uint32\u t uint32;
浮动f;
}混叠;
类型定义结构{
给a取别名;
其他东西;
}结构;
结构=结构{{0xffffffff},0};
int main(){
printf(“%u%f\n”,结构a.uint32,结构a.f);
//输出:4294967295-1.#QNAN0
返回0;
}

谢谢。很好的建议和链接。不幸的是,这只适用于块范围,而不适用于文件范围(我需要使用)。@ChristianMadsen,这改变了一切。我添加了一个答案。ChristianMadsen为什么您认为这在文件范围内不起作用@eznme给出了一个代码示例,该示例准确地展示了如何在文件范围内使用该函数进行静态初始化。@bkausbk给出了两个示例,一个显示C99指定的初始值设定项功能,另一个显示纯C。很好的建议和链接。不幸的是,这只适用于块范围,而不适用于文件范围(我需要使用)。@ChristianMadsen,这改变了一切。我添加了一个答案。ChristianMadsen为什么您认为这在文件范围内不起作用@eznme给出了一个代码示例,说明了如何在文件范围内使用它进行静态初始化。@bkausbk给出了两个示例,一个显示C99指定的初始值设定项功能,另一个显示纯C。不要使用以下划线开头的标识符,如
\u DATA
;很容易侵入实现名称空间并导致未定义的行为。尤其是后跟大写字母时。不要使用以下划线开头的标识符,如
\u DATA
;很容易侵入实现名称空间并导致未定义的行为。特别是当后跟大写字母时。我想您需要
printf(“%”PRIu32“%f\n”,a.uint32,a.f)
的sizeof(unsigned)可能是2。我必须指出,我无法更改结构类型的定义。我只允许更改字段的值。比如:typedef struct{float myfloat;}结构;结构=结构{{0xffffffff},0};我想您需要
printf(“%”PRIu32“%f\n”,a.uint32,a.f)
的sizeof(unsigned)可能是2。我必须指出,我无法更改结构类型的定义。我只允许更改字段的值。比如:typedef struct{float myfloat;}结构;结构=结构{{0xffffffff},0};