将char转换为4位的位字段条目
你好伙计我正面临另一个问题,我正在研究单个位并从ascii文本中提取数据。 问题是编译器给出了一个错误,即将char(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
我要做的是在不改变编译器标志的情况下摆脱错误
使用gcc,您可以通过将值掩盖到您分配的位域中的位数来消除警告,因为type
是4位,您可以执行以下操作:
request.header.type = (unsigned)(j[0]-65) & 0xf;
(请注意,您可以找到几个很好的参数,说明为什么不应该使用位域,请参见此处 ,而是使用普通整数和bitLiddling,如@LP所示)
你应该避免使用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;
像这样的实现也需要关注字节序和对齐。