大家好我正面临另一个问题,我正在处理单个位并从ascii文本中提取数据。问题是编译器给出了一个错误,即将一个字符(8位)转换为4位存储器字段可能会改变其值。
显然这是真的,但我怎么能克服这个错误?
typedef struct {
struct {
unsigned int type: 4;
unsigned int uid: 8;
unsigned int operation: 4;
unsigned int reg: 16;
}header;
char *arg_nm;
} OWL_request;
完整错误:
error: conversion to 'unsigned char:4' from 'char' may alter its value [-Werror=conversion]
这是作业
request.header.type = (char)(j[0]-65);
j
是*char
我要做的是在不改变编译器标志的情况下摆脱错误
答案 0 :(得分:8)
使用gcc,你可以通过将值掩盖到你分配的位域中的位数来消除警告,因为partykit:::.list.rules.party(irisct, i = nodeids(irisct))
## 1
## ""
## 2
## "Petal.Length <= 1.9"
## 3
## "Petal.Length > 1.9"
## 4
## "Petal.Length > 1.9 & Petal.Width <= 1.7"
## 5
## "Petal.Length > 1.9 & Petal.Width <= 1.7 & Petal.Length <= 4.8"
## 6
## "Petal.Length > 1.9 & Petal.Width <= 1.7 & Petal.Length > 4.8"
## 7
## "Petal.Length > 1.9 & Petal.Width > 1.7"
是4位,你可以这样做:
type
(请注意,你可以找到几个很好的论据,说明为什么你不应该使用位域,参见例如here,而是使用普通整数和bitLiddling,如@LP所示)
答案 1 :(得分:2)
你应该避免使用bitfield结构。 使用简单的unsigned int并使用按位运算符来赋值:
#define HEADER_VALUE_MASK 0xFu
#define HEADER_VALUE_POS 0
#define HEADER_UID_MASK 0xFu
#define HEADER_UID_POS 4
uint32_t header;
header |= (value & HEADER_VALUE_MASK) << HEADER_VALUE_POS;
header |= (uid & HEADER_UID_MASK) << HEADER_UID_POS;
这样的实现也需要关注字节序和对齐。