Click here to Skip to main content
Click here to Skip to main content
Technical Blog

Tagged as

Why A + B != A - (-B)

, 23 Dec 2009 CPOL
Rate this:
Please Sign up or sign in to vote.
I sometimes encounter interesting ways of code behavior. I would like to show you one example that is not very interesting practically but might be helpful in understanding more complicated cases.

I would like to show you one example that is not very interesting practically but might be helpful in understanding more complicated cases.

char *A = "123456789";
unsigned B = 1;
char *X = A + B; // X: "23456789"
char *Y = A - (-B); // Y: <Bad Ptr>

If we compile the 32-bit version of the code, the expressions “A + B” and “A - (-B)” will be equivalent. In the 32-bit code, the pointers X and Y point to the second item of the array A. To understand it better, look at the Figure 1 showing the process of calculating “A - (-B)”.

Figure 1 -  "A - (-B)" expression in the 32-bit program

But when we compile the 64-bit code, the expressions “A + B” and “A - (-B)” mean absolutely different things. The subexpression “-B” has an unsigned type and equals 0xFFFFFFFFu. And it is this value 0xFFFFFFFFu that is subtracted from the pointer (see Figure 2).

Figure 2 - "A - (-B)" expression in the 64-bit program

The shown error leads to an access outside the array on a 64-bit system. Such errors might occur when working with negative indexes when 32-bit unsigned variables are used to store them. Here is an example:

unsigned Index = -1;
Array[Index] = Z;

Like in the previous case, the expression “Array[Index] = Z;” works well in the 32-bit program but leads to an error in the 64-bit one.

Conclusion

You should avoid using unsigned data types to store negative values. If the variables used to access array items can take negative values, use only signed data types, for example “int”. Or rather use the types size_t and ptrdfiff_t.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author


Comments and Discussions

 
QuestionWouldn't the same behavior exist on 16-bit systems with larger pointers? Pinmembersupercat923-Dec-09 10:29 
AnswerRe: Wouldn't the same behavior exist on 16-bit systems with larger pointers? PinmemberKarpov Andrey23-Dec-09 21:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.141216.1 | Last Updated 23 Dec 2009
Article Copyright 2009 by viva64.com
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid