[comp.sys.ibm.pc] correct code for pointer subtractio

mcdonald@uxe.cso.uiuc.edu (12/19/88)

I tried compiling the following LEGAL C program (note the line
     struct six s[10000]; 
)

under various memory models of Microsoft C , and all failed, including
Huge. (The declaration for "diff" was changed to K&R 1st edition style
for later use. The original way does the same under Microsoft C).
The problem lies ONLY in the huge model: one cannot expect this to
work with both the -100 and +10000 answers, because one requires
signed division, the other unsigned. 


struct six {
	int i[3];
};

int diff(p,q) 
struct six *p;
struct six *q;
{
  	return  p - q;
}

main(void) {
	struct six s[10000];
	printf("%d\n", diff(s+10000, s));	/* 10000 */
	printf("%d\n", diff(s, s+100));		/* -100 */
}



Okay, then I tried compiling and running it using MicroWay NDP C on my
Model 80. It gave the correct answer, just as I would expect it to.

FINALLY, I changed "diff(s+10000,s)" to "diff(s+500000000,s)"
(note, no change in the declaration of s), recompiled under NDP C
and got

142086058
-100

which is wrong, just as I would have expected.

Microsoft C is still broken. NDP C isn't - it is unequivocally,
definitely, small model (32 bit ints, 32 bit pointers, no "far" keyword.)


Doug McDonald