Xref: utzoo comp.arch:4753 comp.lang.c:10046 Path: utzoo!mnetor!uunet!husc6!cmcl2!nrl-cmf!ames!amdahl!amdcad!tim From: tim@amdcad.AMD.COM (Tim Olson) Newsgroups: comp.arch,comp.lang.c Subject: Re: negative addresses Message-ID: <21541@amdcad.AMD.COM> Date: 10 May 88 20:36:35 GMT References: <2393@uvacs.CS.VIRGINIA.EDU> Organization: Advanced Micro Devices, Inc., Sunnyvale, Ca. Lines: 39 Note: I am also including comp.lang.c, since this also pertains to C... In article <2393@uvacs.CS.VIRGINIA.EDU>, wulf@uvacs.CS.VIRGINIA.EDU (Bill Wulf) writes: | Has anyone ever seen a machine with "negative addresses", that is, one | where the address space is -2**31..2**31-1 rather than 0..2*32-1?? | Any thoughts on what the problems with such a scheme might be (or are)? I can't think of any real problems offhand, but this representation affects a few things: Your program's virtual address space probably starts at -2**31, rather than 0 (to give you the full range). This means that C-language null pointers, because they are defined never to point to a valid address, will probably have to be something other than the standard all-zero bit representation. This is not a real problem, as C allows this. However, it complicates the compiler somewhat (having to detect the assignment/comparison of a pointer and the integer constant 0 as a special case). Also, buggy programs that used to run with references through uninitialized static pointers might break in horrible ways (this is not necessarily bad! ;-) | Why ask such a question, you ask -- well, I'm trying to remove unsigned | arithmetic from WM, and as far as I can tell, the primary (only?) use | of unsigned arithmetic is for address computations. Soooooo... What about support for explicit unsigned types in HLLs? This would only work if you limited the range of "unsigned" values to 0..2**31-1, rather than the full 32-bit range. However, my copy of the ANSI C Draft Spec (which might be out of date) says: "For |signed char| and each type of |int|, there is a corresponding unsigned type (declared with the keyword |unsigned|) that utilizes the same amount of storage including sign information. The set of nonnegative values of a signed type is a subset of its corresponding unsigned type." -- Tim Olson Advanced Micro Devices (tim@delirun.amd.com)