Related articles |
---|
1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 devriese@cs.tcd.ie (Edsko de Vries) (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 torbenm@app-0.diku.dk (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 rsc@swtch.com (Russ Cox) (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 jm@bourguet.org (Jean-Marc Bourguet) (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 mailbox@dmitry-kazakov.de (Dmitry A. Kazakov) (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 gneuner2@comcast.net (George Neuner) (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 rivers@dignus.com (Thomas David Rivers) (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 david@tribble.com (David R Tribble) (2006-01-31) |
Re: 1 - 1, 1 -1, 1-1, 1 - -1 and -2147483648 henry@spsystems.net (2006-01-31) |
[3 later articles] |
From: | "Russ Cox" <rsc@swtch.com> |
Newsgroups: | comp.compilers |
Date: | 31 Jan 2006 12:47:25 -0500 |
Organization: | Compilers Central |
References: | 06-01-131 |
Keywords: | lex, arithmetic |
Posted-Date: | 31 Jan 2006 12:47:25 EST |
> This works fine, with the sole exception of the number "-2147483648".
> The problem is, of course, overflow: -2147483648 is a valid negative
> number (assuming 32-bit numbers), but the integer 2147483648 is _not_ a
> valid positive number. Thus, the above method of dealing with "-" as a
> unary operator breaks down.
I know a few vendor-supplied C compilers that get this wrong,
printing warnings about "positive constant overflows" or something
like that, which is all the more confusing an error when you look at
it and say "but that's *not* a positive constant!".
> The solution is to interpret the "-" as part of the number, and
> generate INT(-2147483648),
I think a better solution is to let the parser do its job and determine
whether the - is a negation or a subtraction, and then once that
is done, you can warn about INT(2147483648) that isn't inside a
negation. I put this into the Plan 9 C compilers recently and it
worked well.
Russ
Return to the
comp.compilers page.
Search the
comp.compilers archives again.