C에서 비트 필드를 사용하는 올바른 방법은 무엇입니까?
-
06-09-2019 - |
문제
FPU가없는 마이크로 컨트롤러를 만들려고하는 플로트 라이브러리에서 쉽게 액세스 할 수 있도록 비트 필드를 사용하고 있습니다.
문제는 비트 필드에서 작동하게 할 수 없다는 것입니다. 구경하다:
typedef struct
{
union{
unsigned long mantissa: 23;
unsigned long exponent: 8;
unsigned long sign: 1;
float all;
};
}_float __attribute__((__packed__));
문제는 내가 액세스하거나 변경하려고 할 때 비트 필드를 각각 1,8,23 비트로 간주한다는 것입니다. 끝에서 23 비트이어야하지만 8 비트, 마지막 비트가되어야합니다. 비트 필드의 사용을 완전히 오해하지 않는 한. 나는 그것을 사용한다고 생각했다 포장 된 문제를 해결할 수는 있지만 보시다시피는 그렇지 않았습니다.
모든 도움이 정말 감사하겠습니다. 나는이 사이트로 두 번 이상 인터넷 검색을하면서 높은 희망을 가지고 있습니다.
해결책
당신은 당신의 노조 내부에 구조물이 없을 수 있습니다.
typedef struct
{
union{
struct {
unsigned long mantissa: 23;
unsigned long exponent: 8;
unsigned long sign: 1;
} float_parts;
float all;
};
}_float __attribute__((__packed__));
Mantissa/지수 및 표시의 순서는 CPU의 Endianess에 달려 있습니다.
다른 팁
문제는 그것이 노조라는 것입니다. '구조'여야합니다.
GLIBC 플랫폼에있는 경우 IEEE754.H 헤더 파일을 살펴볼 수 있습니다. 그것은 endianess 물건을 돌 봅니다. 그렇지 않다면 여전히 그것을 살펴볼 가치가 있습니다.
제휴하지 않습니다 StackOverflow