From: <rr...@cs...> - 2005-10-20 17:27:07
|
I'm a bit confused here, Brian pointed out an aliasing problem in your code that I can't find in your message on Sourceforge's archive on this list. But I can find another aliasing problem in the code that appears in the archive: >#if 1 > uSum += *((u_short*)&uOldValue) + (~(*((u_short*)&uNewValue)) & >0xFFFF) + *((u_short*)&uOldValue + 1) + (~(*((u_short*)&uNewValue + 1)) & >0xFFFF); >#else > uNewValue = ~uNewValue; > uSum += (uOldValue & 0xFFFF) + (uOldValue >> 16); > uSum += (uNewValue & 0xFFFF) + (uNewValue >> 16); >#endif In the first alternative, you're breaking strict aliasing rules and in the seconfd alternative you're not. In Standard C the effect of accessing an object, whether reading or writing, using a pointer of different type than the object's type is undefined unless you use a pointer to unsigned char. There's really no reason to use the first alternative. The second alternative is easier to read and understand, and likely to be faster since it doesn't force the values into memory. Ross Ridge |