Using the latest Keil C compiler (V7.00) Executing on an Infineon XC161CJ-16F This code appears to produce the wrong result.
At the "if" statement I expect v1 to equal v3 and for the main function to return 0 (I don't actually want to use the return value, its just a mock up piece of code). However, at the "if" statement, the value of v1 is 0x1234 and the value of v3 is 0xB1234.
Can anyone explain why?
typedef unsigned long ULONG; typedef unsigned short USHORT; typedef BYTE * POINTER; POINTER v1,v2,v3,v4; ULONG temp_ptr; int main(void) { v1 = (POINTER)0; v2 = (POINTER)0x0B1234; v1 += (ULONG)v2; // This assigns 0x1234 to v1, I think it should assign 0xB1234 v3 = (POINTER)0; v4 = (POINTER)0x0B1234; temp_ptr = (ULONG)v3; v3 = temp_ptr+v4; // This statement assigns 0xB1234 to v3 correctly. if ( v1!=v3 ) return -1; else return 0; }
@Tamir Michael Using the ARM complier, this code behaves according the OP's comments.
I'm sorry I don't understand which way you mean that comment.
Are you seeing the same unexplained behaviour, i.e. that v1!=v3? Or are you seeing what I expected to see, that v1==v3?
Regards Paul
The ARM have nice 32-bit linear pointers behaving identically to 32-bit integers. So type casting and adding/subtracting/multiplying will give nice results.
But see the links in my other post regarding the C166.
A developer who do play fancy with pointers should better create a target-specific function that _creates_ a valid pointer based on some input data. Then you can conditionally compile this function depending on target hardware.
@Paul Blackmore,
I meant to say that the ARM compiler generates code that operates according to your original expectations (thus, it assigns 0xB1234).