将 char 转换为 4 位的位域条目

标签 c casting

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

(请注意,您可以找到几个很好的论据来说明为什么不应该使用位域,请参见例如 here,而是按照@LPs 的建议使用普通整数和位旋转)

关于将 char 转换为 4 位的位域条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976147/

相关文章:

Java 泛型和转换为原始类型

c - 使用 glib 从配置文本中读取值

c - ARM汇编指针指向指针?

c - 如何在c中读取未知数据类型的hdf5数据集?

php - 代码替换

两个可能不相关的类之间的 Java 转换

c - 如何从需要查找的标准输入管道数据中高效读取

c - 为什么在循环外部和内部声明具有相同名称的变量不会产生错误?

c# - 为什么我不能将基引用强制转换为由派生类实现的变体接口(interface)?

java - 检查 Object 是否是 String、HashMap 或 HashMap[] 的实例