6
votes

The following code:

unsigned char result;
result = (result << 4 );

Compiled with gcc version 4.6.4 (Debian 4.6.4-2), with the -Wconversion flag results in the warning

warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]

Why is that?

3
Implicit type conversion rules, Bitwise operators auto promotes char to int in C, C++ - Grijesh Chauhan
here is answer, you are looking for: stackoverflow.com/questions/3482262/… - Konstantin Vladimirov

3 Answers

8
votes

Because the standard says so. The operands to binary operators undergo integral promotion, in which anything smaller than an int is promoted to int; the results of the operation have type int as well. And if the original value were, say, 0x12, the results would be 0x120, and assigning this to an unsigned char will cause a change in value. (The assigned value will be 0x20.) Whence the warning.

EDIT:

From the standard (§5.8 Shift operators): " The operands shall be of integral or unscoped enumeration type and integral promotions are performed. The type of the result is that of the promoted left operand." Unlike other binary operators, there is no effort to find a common type from the two operators: the result type is that of the left operand, period. But integral promotion does still occur: the unsigned char will be promoted to int (or to unsigned int if int has a size of 1).

1
votes

Because the int value can be larger than can fit in an unsigned char.

Think about what will happen when result is 255 (i.e. 0xff). Shifting it left four bits will make it 4080 (or 0xff0). How will the compiler be able to squeeze that value back into result? It can't, so it simply truncates it to 240 (0xf0). In other words, the value of the integer operation result << 4 may be be altered.

0
votes

All arithmetic and logical operators perform the "integral promotions" on their arguments. The integral promotions turn types that are smaller than int (like unsigned char) into int or unsigned int. You'll see the same thing if you replace << with +.

Oh, and the parentheses aren't needed.