Intereting Posts
Как скомпилировать и запустить C в возвышенном тексте 3? удалить все вхождения символа в строке C – Пример необходимо почему мы не можем передать указатель по ссылке в C? Компилировать без генерации выходного файла в GCC Что делает этот кусок кода и что означает каждый из используемых символов? Используемый язык – это C, и я всего лишь новичок в кодировании Рекурсия в C, понять пример рекурсии Отладочные отпечатки Linux-ядра? Почему привязка к sdl2 и udev вызывает ошибку сегментации? Именование переменной с другой переменной в C Оптимизированное умножение матрицы 2×2: медленная assembly по сравнению с быстрым SIMD Как проверить, является ли файл текстовым (ASCII) или двоичным в C Есть ли хороший крошечный XML-парсер для встроенного проекта C? configure: ошибка: компилятор C не может создавать исполняемые файлы в mac os terminal Как сбросить произвольную структуру в C? Переполнение буфера функции sprintf?

Ввести char в бит полевой записи из 4 бит

Привет, ребята, я столкнулся с другой проблемой, я работаю над отдельными битами и извлекаю данные из текста 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

Мне нужно избавиться от ошибки без изменения флагов компилятора

С помощью gcc вы можете избавиться от предупреждения, замаскировав это значение на количество бит в битовом поле, которое вы назначили, поскольку type – 4 бита, вы можете сделать:

 request.header.type = (unsigned)(j[0]-65) & 0xf; 

(Обратите внимание, что вы можете найти несколько хороших аргументов в пользу того, почему вы не должны использовать битовые поля, см., Например, здесь , и вместо этого используйте простые целые числа и бит twiddling, как предложено @LPs)

Вам следует избегать структуры битового поля. Используйте простые без знака 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; 

Подобная реализация также заботится о контенте и алиментах.