将char转换为4位的位字段条目

时间:2017-02-01 09:27:45

标签: c casting

大家好我正面临另一个问题,我正在处理单个位并从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

我要做的是在不改变编译器标志的情况下摆脱错误

2 个答案:

答案 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;

这样的实现也需要关注字节序和对齐。