This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem with Shift-Operator

Hi,

I have a Problem with the Shift-Operator >> within my C-Code.
I'm using PK166 V4.2
The following code should set the Variable n to 0.

void main()
{
 unsigned char n;
 unsigned char p;  // dummy

 n=255;
 n=n>>22;

 p=0;		// dummy

}

With Simulator and real hardware n=3!

The Compiler generates a shift of 22, which is invalid. The Assembler Opcode only evaluates the lower 4 bits of the shift-operand.

Generated Assembler Code:
R4 contains the variable n:

 MOV R5, #0x16 // incorrect Opcode???
 SHR R4,R5

The lower 4 bits of 0x16=0x06, and that is what really happens. ( 255 >> 6 = 3 )

I get the same result with Compiler V5.04.

Is it invalid to shift a byte-variable more than 8 times?
If so, why does the compiler not generate a warning?

Parents
  • Is it invalid to shift a byte-variable more than 8 times?
    From the ANSI C standard: "If the shift count is negative or is greater than or equal to the number of bits contained in the object being shifted, the resulf of the shift is undefined"
    If so, why does the compiler not generate a warning?
    The purpose of the compiler is to compile your program, not to protect you against yourself. As you see the compilere adhere to the standard. If you want checking to this level I suggest you obtain a copy of PClint.

    Erik

Reply
  • Is it invalid to shift a byte-variable more than 8 times?
    From the ANSI C standard: "If the shift count is negative or is greater than or equal to the number of bits contained in the object being shifted, the resulf of the shift is undefined"
    If so, why does the compiler not generate a warning?
    The purpose of the compiler is to compile your program, not to protect you against yourself. As you see the compilere adhere to the standard. If you want checking to this level I suggest you obtain a copy of PClint.

    Erik

Children