Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why no warning when uint32 casts to uint8 with gcc C

Compiling with -Wconversion,

uint32_val = 0x00000C00;
uint_8_val = ((uint32_val >> 8) & 0x000000FF);

gives no warning.

What compiler flag shall I use to get a warning?

like image 757
temp Avatar asked Dec 03 '13 15:12

temp


2 Answers

There is no warning because the expression:

((uint32_val >> 8) & 0x000000FF)

is always convertible to a type that fits in a byte. Your uint32_val is not cast, but takes part in a calculation. The compiler can optimize this, and in this case it is clear the result after bit-wise and-ing with 000000ff will always fit the provided l-value type, hence no warning.

like image 146
DNT Avatar answered Sep 28 '22 09:09

DNT


Your code will compile fine. The type of plain constants is determined to be the best fitting.

You will get warning for this code:

uint32_val = 0x00000C00;
uint_8_val = ((uint32_val >> 8) & 0x000001FF);

Compilers shouldn't enforce coding guidelines. That's two different thing.

like image 32
Kobor42 Avatar answered Sep 28 '22 08:09

Kobor42