Das Schieben einer 8-bit Zahl um 1 bit nach links müsste doch das Gleiche sein, wie eine Multiplikation mit 2:
1 | unsigned char a,b,c; |
2 | a = 4; |
3 | b = a << 1; |
4 | c = a*2; // c == b? |
Die Zeile
1 | b = a << 1; |
gibt mir jedoch eine Compilerwarnung: warning: implicit conversion loses integer precision: 'int' to 'unsigned char' [-Wconversion],
1 | c = a*2 |
jedoch nicht. Anscheinend wird a << 1 in eine 16-bit Integer umgewandelt, bei der anschliessenden Zuweisung zu unsigned char kommt es zu der Warnung. Warum passiert das bei a*2 nicht?