Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use of small integer with bits operator in C

Related to a previous question, I can't understand some rules of MISRA C 2004.

In ISO C99 draft 2007, in 6.5 section §4 :

Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, and |, collectively described as bitwise operators) are required to have operands that have integer type. These operators yield values that depend on the internal representations of integers, and have implementation-defined and undefined aspects for signed types.

Ok, using a signed integer with bitwise operators can produce undefined behaviour (and makes no sense).

A good solution is to use explicit conversion to a wider unsigned integer type in order to by-pass integral promotion, and then not use signed value with bitwise operators (see associated answers of my previous question).

But in MISRA C 2004, use of small unsigned integers with bitwise operators is possible (rule 10.5 for example). Why, if integral promotion leads to use signed values with bitwise operators? I think I don't understand some things.

like image 676
no_name Avatar asked Oct 07 '14 15:10

no_name


1 Answers

The rules don't contradict each other and you don't need to widen the type. You can immediately cast the result of small integer binary operation back to its type.

A small integer will not be promoted to int for shifts unless the first operand is int.

This is from their example:

uint8_t port = 0x5aU;
uint8_t result_8;
uint16_t result_16;

result_8 = (~port) >> 4;  /* not compliant */
result_8 = ((uint8_t)(~port)) >> 4; /* compliant */
result_16 = ((uint16_t)(~(uint16_t)port)) >> 4; /* compliant */
like image 163
James Avatar answered Oct 14 '22 12:10

James